Re: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7

Поиск
Список
Период
Сортировка
От Dave Cramer
Тема Re: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7
Дата
Msg-id CADK3HHK4zQ-8JxFRpF6QbspUDc0H73mxdW7UZobNcGDifeacLQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7  (Andre Mikulec <andre_mikulec@hotmail.com>)
Ответы Re: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7  ("dandl" <david@andl.org>)
Re: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7  (Joe Conway <mail@joeconway.com>)
Список pgsql-hackers
Does anyone else have a Windows 7 installation we can test this on ?

This https://github.com/postgres-plr/plr/files/191013/plr-8.3.0.16-pg9.5-win32.zip is actually a 64 bit version built on windows 10. I've had one confirmation that it works.

Dave


On 30 April 2016 at 12:39, Andre Mikulec <andre_mikulec@hotmail.com> wrote:
Joe,

"
Who did the compiling? Did you compile everything yourself, or use
binary installers for some of it? If so, which ones?
"

This is really a continuation of the experience I had with Dave Cramer in here.

Postgresql 9.5 support #1
https://github.com/postgres-plr/plr/issues/1


To try to figure out the problem, ( and perhaps? eliminate Microsoft from the problem),
I compiled a PostgreSQL [debug] version myself.

C:\Users\AnonymousUser\Desktop\PostgreSQL.9.5.1\App\PgSQL>chcp 1252 > nul && "%PGSQL%\bin\psql.exe"
psql (9.5.1)
Type "help" for help.

postgres=# select version();
                                                          version
----------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.5.1 on i686-pc-mingw32, compiled by gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.3.0, 64-bit
(1 row)

I also built a non-debug plr.dll/plr myself too.
I modified ( mostly simplified ) https://github.com/jconway/plr/blob/master/Makefile
in the Makefile, I eliminated ( by much trial and error ) the OS non_window stuff, the pkg-config stuff, and the  PGXS stuff .

Then I did,
AnonymousUser@ANONYMOUSX /c/Users/AnonymousUser/postgresql-9.4.1/contrib
$ make -C plr clean

AnonymousUser@ANONYMOUSX /c/Users/AnonymousUser/postgresql-9.4.1/contrib
$  make -C plr all

So now I have my own plr.dll.

Then, I followed the instructions ( INSTALL.txt ) found in here.
http://www.joeconway.com/plr/plr-8.3.0.16-pg9.4-win64.zip

However, I used my own plr.dll/plr
Seems, that in the destination, I had to copy plr.dll to plr, but that seems to work fine.

Later, after I finish following "create extension plr;" found in http://www.joeconway.com/plr/doc/plr-install.html

I do

postgres=# select plr_version();
 plr_version
-------------
 08.03.00.16
(1 row)

postgres=#   select plr_environ();

 (PGDATA,C:/Users/AnonymousUser/Desktop/PostgreSQL.9.5.1/Data/data)
 (PGDATABASE,postgres)
 (PGLOCALEDIR,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.5.1\\App\\PgSQL\\share\\")
 (PGLOG,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.5.1\\Data\\log.txt")
 (PGSQL,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.5.1\\App\\PgSQL")
 (PGSYSCONFDIR,C:/Users/AnonymousUser/Desktop/PostgreSQL.9.5.1/App/PgSQL/etc)
 (PGUSER,postgres)

 (R_ARCH,/x64)
 (R_HOME,C:/Users/AnonymousUser/Desktop/R-3.2.4)
 (R_KEEP_PKG_SOURCE,yes)
 (R_LIBS_USER,"C:\\Users\\AnonymousUser\\Documents/R/win-library/3.2")
 (R_USER,"C:\\Users\\AnonymousUser\\Documents")

NOTE: The directory structure is from Postgre 9.4 Portable,  I just use ONLY the directory structure.
The one and ONLY file I use is the pgsql.cmd batch startup file ( I did my 'environment' and 'user friendly modifications.' )

postgres=#

I do this, I get no results, and no error.

postgres=# SELECT * FROM pg_catalog.pg_class WHERE relname = 'plr_modules' AND relnamespace = 2200;
 relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages
---------+--------------+---------+-----------+----------+-------+-------------+---------------+----------
(0 rows)

But, then this ( R language code ) strangely works.

postgres=# select r_version(); # THIS IS THE 'R LANGUAGE' ( IF THE EXTENSION 'works' )
                    r_version
-------------------------------------------------
 (platform,x86_64-w64-mingw32)
 (arch,x86_64)
 (os,mingw32)
 (system,"x86_64, mingw32")
 (status,"")
 (major,3)
 (minor,2.4)
 (year,2016)
 (month,03)
 (day,10)
 ("svn rev",70301)
 (language,R)
 (version.string,"R version 3.2.4 (2016-03-10)")
 (nickname,"Very Secure Dishes")
(14 rows)

This does not work.
postgres=# select upper(typname) || 'OID' as typename, oid from pg_catalog.pg_type where typtype = 'b' order by typname;
ERROR:  could not open file "base/12373/1247": No such file or directory

This ( R language code ) that uses that SQL does not work.

postgres=# select load_r_typenames();
ERROR:  R interpreter expression evaluation error
DETAIL:  Error in pg.spi.exec(sql) :
  error in SQL statement : could not open file "base/12373/1247": No such file or directory
CONTEXT:  In R support function pg.spi.exec
In PL/R function load_r_typenames

In real-time ( exactly right now ), I have exactly  PostgreSQL 9.4.1 (and pl/r and R.3.1.2 )on Windows 7 running on port 5433.
This Postgre 9.1.1 uses the  same hard disk ( 9.4.1 and 9.5.1 (above) share the exact same hard disk.)

C:\Users\AnonymousUser\Desktop\PostgreSQL.9.4.1\App\PgSQL> "%PGSQL%\bin\psql.exe" --port 5433
psql (9.4.1)
Type "help" for help.

postgres=# select version();
                           version
-------------------------------------------------------------
 PostgreSQL 9.4.1, compiled by Visual C++ build 1800, 64-bit
(1 row)

postgres=#  select plr_version();
 plr_version
-------------
 08.03.00.16
(1 row)

postgres=#  select plr_environ();

 (PGDATA,C:/Users/AnonymousUser/Desktop/PostgreSQL.9.4.1/Data/data)
 (PGDATABASE,postgres)
 (PGLOCALEDIR,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.4.1\\App\\PgSQL\\share\\")
 (PGLOG,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.4.1\\Data\\log.txt")
 (PGSQL,"C:\\Users\\AnonymousUser\\Desktop\\PostgreSQL.9.4.1\\App\\PgSQL")
 (PGSYSCONFDIR,C:/Users/AnonymousUser/Desktop/PostgreSQL.9.4.1/App/PgSQL/etc)
 (PGUSER,postgres)

 (R_ARCH,/x64)
 (R_HOME,C:/Users/AnonymousUser/Desktop/R.3.1.2/App/R-Portable)
 (R_LIBS_USER,"C:\\Users\\AnonymousUser\\Documents/R/win-library/3.1")
 (R_USER,"C:\\Users\\AnonymousUser\\Documents")

This also returns zero rows. ( Should it do that? ).

postgres=# SELECT * FROM pg_catalog.pg_class WHERE relname = 'plr_modules' AND relnamespace = 2200;
 relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages |
---------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-
(0 rows)

postgres=# select r_version();
                    r_version
-------------------------------------------------
 (platform,x86_64-w64-mingw32)
 (arch,x86_64)
 (os,mingw32)
 (system,"x86_64, mingw32")
 (status,"")
 (major,3)
 (minor,1.2)
 (year,2014)
 (month,10)
 (day,31)
 ("svn rev",66913)
 (language,R)
 (version.string,"R version 3.1.2 (2014-10-31)")
 (nickname,"Pumpkin Helmet")
(14 rows)

This works.  It did not work (above) in PostreSQL 9.5.1.

postgres=# select upper(typname) || 'OID' as typename, oid from pg_catalog.pg_type where typtype = 'b' order by typname;
       typename       |  oid
----------------------+-------
 _ABSTIMEOID          |  1023
...
 XMLOID               |   142
(135 rows)


This ( R language) works. It did not work ( above ) in PostreSQL 9.5.1

postgres=# select load_r_typenames();
 load_r_typenames
------------------
 OK
(1 row)

So in summary, I can not see anything wrong with pl/r.

Something seems not fully right with  the IO of Postgresql 9.5 on Windows [7] [64 bit]

One difference that I can currently see this that 9.4.1 psql uses a different code page than 9.5.1 psql .
9.5.1 psql has to be forced to use 1252 ( chcp 1252 ) .  Does this matter?

Are there any recommended changes to make the IO of 9.5.1 behave like the IO of 9.4.1?

In comparing the 9.4.1 postgresql.conf to the 9.5.1 postgresql.conf,
these are the differences found. ( These are both defaults )

AnonymousUser@ANONYMOUSX /c/Users/AnonymousUser/postgresql-9.5.1/contrib
$ diff --ignore-space-change --ignore-all-space --ignore-blank-lines  --strip-trailing-cr /c/Users/AnonymousUser/Desktop/PostgreSQL.9.4.1/Data/data/postgresql.conf /c/Users/AnonymousUser/Desktop/PostgreSQL.9.5.1/Data/data/postgresql.conf

86d85
< #ssl_renegotiation_limit = 512MB      # amount of data between renegotiations
92a92
> #row_security = on
165c165
< #effective_io_concurrency = 1         # 1-1000; 0 disables prefetching
---
> #effective_io_concurrency = 0         # 1-1000; 0 disables prefetching
187a188
> #wal_compression = off                        # enable compression of full-page writes
199d199
< #checkpoint_segments = 3              # in logfile segments, min 1, 16MB each
200a201,202
> #max_wal_size = 1GB
> #min_wal_size = 80MB
206c208
< #archive_mode = off           # allows archiving to be done
---
> #archive_mode = off           # enables archiving; off, on, or always
230a233,234
> #track_commit_timestamp = off # collect timestamp of transaction commit
>                               # (change requires restart)
259a264,265
> #wal_retrieve_retry_interval = 5s     # time to wait before retrying to
>                                       # retrieve WAL after a failed attempt
434a441
> #log_replication_commands = off
440a448,454
> # - Process Title -
>
> #cluster_name = ''                    # added to process titles if nonempty
>                                       # (change requires restart)
> #update_process_title = on
>
>
452d465
< #update_process_title = on
519a533,534
> #gin_fuzzy_search_limit = 0
> #gin_pending_list_limit = 4MB
578a594
> #operator_precedence_warning = off

Are there any recommended postgresql.conf changes?

What do I do next?
Will anyone help me?
Do I report this to someone?
Do I file a bug?
Do I try to debug PostreSQL 9.5 on Windows myself? ( I am not a C/C++ guy.  I am a DBA. )

Thank you,
Andre Mikulec
Andre_Mikulec@Hotmail.com

________________________________________
From: Joe Conway <mail@joeconway.com>
Sent: Friday, April 29, 2016 5:02 PM
To: Andre Mikulec; pgsql-hackers@postgresql.org
Subject: Re: [HACKERS] SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7

On 04/29/2016 07:58 AM, Andre Mikulec wrote:
> I am working with pl/r compiled for R.3.2.4 64 bit on PostgreSQL 9.5.1
> 64 bit on Windows 7 64 bit

Who did the compiling? Did you compile everything yourself, or use
binary installers for some of it? If so, which ones?

Joe

--
Crunchy Data - http://crunchydata.com
PostgreSQL Support for Secure Enterprises
Consulting, Training, & Open Source Development


________________________________________

From: Andre Mikulec <andre_mikulec@hotmail.com>
Sent: Friday, April 29, 2016 10:58 AM
To: pgsql-hackers@postgresql.org
Subject: SPI_exec ERROR in pl/r of R 3.2.4 on PostgreSQL on Windows 7

I am working with pl/r compiled for R.3.2.4 64 bit on PostgreSQL 9.5.1 64 bit on Windows 7 64 bit


At the end of this issue, I am getting the following error.
https://github.com/postgres-plr/plr/issues/1

  ERROR:  could not open file "base/12373/2663": No such file or directory
  LINE 1: SELECT NULL FROM pg_catalog.pg_class WHERE relname = 'plr_mo...
                         ^
QUERY:  SELECT NULL FROM pg_catalog.pg_class WHERE relname = 'plr_modules' AND relnamespace = 2200

The error seems to be coming from SPI_exec.

If I run this SQL manually from psql
SELECT NULL FROM pg_catalog.pg_class WHERE relname = 'plr_modules' AND relnamespace = 2200

The result is returned and is correct.

* The problem is not my hard disk. *
I am running multiple versions of PostgreSQL on the same hard disk. *

The following run fine.
Regular Windows pre-compiled PostgreSQL 9.4.1 downladed from downloaded from postgresql.org
Regular Windows pre-compiled PostgreSQL 9.5.1 downladed from downloaded from postgresql.org
Regular Windows pre-compiled PostgreSQL 9.5.2 downladed from downloaded from postgresql.org

THe problem is not security.
I am gave 'Full Access' to Administators group , EveryOne group, and Users group to
the directories containing all of the PostgreSQL directries containing both/either data and binaries.

I have shutdown all virus software: AVG.

The pl/r and plr.dll for R 3.1.2 64 bit runs fine on PostgreSQL 9.4.1 64bit on Windows 7 64
The pl/r source code has not changed at least since PostgreSQL 9.4.1.

I have physically examined the pl/r source code.
It seems relatively simple to understand.

THe error seems to only come from here.
https://raw.githubusercontent.com/jconway/plr/master/plr.c


static bool
haveModulesTable(Oid nspOid)
{
StringInfo
sql = makeStringInfo();
char
  *sql_format = "SELECT NULL "
"FROM pg_catalog.pg_class "
"WHERE "
"relname = 'plr_modules' AND "
"relnamespace = %u";
    int  spiRc;

appendStringInfo(sql, sql_format, nspOid);

spiRc = SPI_exec(sql->data, 1);
if (spiRc != SPI_OK_SELECT)
/* internal error */
elog(ERROR, "haveModulesTable: select from pg_class failed");

return SPI_processed == 1;
}


I noticed that the using in the SPI_exec function *seems* to be similar in the source code.

https://raw.githubusercontent.com/postgres/postgres/3aff33aa687e47d52f453892498b30ac98a296af/src/test/regress/regress.c

query = (char *) palloc(100 + NAMEDATALEN * 3 +
strlen(fieldval) + strlen(fieldtype));

sprintf(query, "insert into %s select * from %s where %s = '%s'::%s",
SPI_getrelname(rel), SPI_getrelname(rel),
SPI_fname(tupdesc, 1),
fieldval, fieldtype);

if ((ret = SPI_exec(query, 0)) < 0)
elog(ERROR, "funny_dup17 (fired %s) on level %3d: SPI_exec (insert ...) returned %d",
when, *level, ret);



AND SPI_exec *seems* to be similar here

https://raw.githubusercontent.com/postgres/postgres/8b99edefcab1e82c43139a2c7dc06d31fb27b3e4/src/backend/commands/matview.c

StringInfoData querybuf;
initStringInfo(&querybuf);

/* Analyze the temp table with the new contents. */
appendStringInfo(&querybuf, "ANALYZE %s", tempname);
if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY)
elog(ERROR, "SPI_exec failed: %s", querybuf.data);

It is defined here.

https://raw.githubusercontent.com/postgres/postgres/3aff33aa687e47d52f453892498b30ac98a296af/src/include/executor/spi.h

extern int SPI_execute(const char *src, bool read_only, long tcount);


https://raw.githubusercontent.com/postgres/postgres/39c283e498de1bb7c3d5beadfffcf3273ae8cc27/src/backend/executor/spi.c

/* Parse, plan, and execute a query string */
int
SPI_execute(const char *src, bool read_only, long tcount)
{
_SPI_plan
plan;
int
res;

if (src == NULL || tcount < 0)
return SPI_ERROR_ARGUMENT;

res = _SPI_begin_call(true);
if (res < 0)
return res;

memset(&plan, 0, sizeof(_SPI_plan));
plan.magic = _SPI_PLAN_MAGIC;
plan.cursor_options = 0;

_SPI_prepare_oneshot_plan(src, &plan);

res = _SPI_execute_plan(&plan, NULL,
InvalidSnapshot, InvalidSnapshot,
read_only, true, tcount);

_SPI_end_call(true);
return res;
}


/* Obsolete version of SPI_execute */
int
SPI_exec(const char *src, long tcount)
{
return SPI_execute(src, false, tcount);
}


My Big question is the following,

Has there been any change in the PostgreSQL IO code from 9.4.1. to 9.5.1
that may be possibly causing this problem ( in SPI_exec or elsewhere )?

  ERROR:  could not open file "base/12373/2663": No such file or directory

Any answers with any possibilities of any directions are welcome.

Thank you,
Andre Mikulec
Andre_Mikulec@Hotmail.com


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: pgindent fixups
Следующее
От: Masahiko Sawada
Дата:
Сообщение: Re: Reviewing freeze map code