#24679 [Com]: pg_insert problem!
| From: | pentropia at gmail dot com | Date: | Wed, 14 Mar 2007 16:07:04 +0000 |
| Subject: | #24679 [Com]: pg_insert problem! | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-110340@lists.php.net to get a copy of this message | ||
ID: 24679
Comment by: pentropia at gmail dot com
Reported By: rorezende at hotmail dot com
Status: No Feedback
Bug Type: PostgreSQL related
Operating System: *
PHP Version: 4.3.2
Assigned To: helly
New Comment:
Iv'e noticed the same problem on php 5.2.1
Previous Comments:
------------------------------------------------------------------------
[2005-09-21 05:04:00] nathanr at nathanr dot net
Nope, this is a genuine bug, I've tested on SuSE Linux Professional 9.3
using both PHP 4.3.10 and 5.0.3 against PostgreSQL 8.0.3. They both
produce non-working results. To replicate the bug:
test.sql:
create schema tstschma;
create table tstschma.tsttbl (
x int not null,
y int not null,
primary key (x)
);
now try this php:
$db = pg_connect("dbname=testdb");
$l = array('x'=>'1', 'y'=>'2');
pg_insert($db, "tstschma.tsttbl", $l);
pg_close($db);
If you remove the schema (tstschma) from the name then the select
works, but the insert of course does not.
The problem stems from the fact that pg_class.relname does not include
the schema name, but to run a query against the table you must have the
schema name. I suggest your fix is to strip everything before and
including the last dot in the table name (won't change anything for
those not using schemas, but will strip "tstschma." from the above
example), but use the table name passed to the method (ie. including
the "tstschma.") when you go to do the insert.
------------------------------------------------------------------------
[2005-09-21 05:03:41] nathanr at nathanr dot net
Nope, this is a genuine bug, I've tested on SuSE Linux Professional 9.3
using both PHP 4.3.10 and 5.0.3 against PostgreSQL 8.0.3. They both
produce non-working results. To replicate the bug:
test.sql:
create schema tstschma;
create table tstschma.tsttbl (
x int not null,
y int not null,
primary key (x)
);
now try this php:
$db = pg_connect("dbname=testdb");
$l = array('x'=>'1', 'y'=>'2');
pg_insert($db, "tstschma.tsttbl", $l);
pg_close($db);
If you remove the schema (tstschma) from the name then the select
works, but the insert of course does not.
The problem stems from the fact that pg_class.relname does not include
the schema name, but to run a query against the table you must have the
schema name. I suggest your fix is to strip everything before and
including the last dot in the table name (won't change anything for
those not using schemas, but will strip "tstschma." from the above
example), but use the table name passed to the method (ie. including
the "tstschma.") when you go to do the insert.
------------------------------------------------------------------------
[2003-07-23 22:30:19] sniper@php.net
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.
------------------------------------------------------------------------
[2003-07-16 21:28:37] sniper@php.net
Please provide an example script which shows the problem clearly.
------------------------------------------------------------------------
[2003-07-16 09:44:50] rorezende at hotmail dot com
Description:
------------
In source code of php 4.3.2 exists an error ext/pgsql/pgsql.c.
In the function pg_convert (php_pgsql_convert) it is not necessary to
specify the schema name. But in the sql statement insert it is. Below
is the portion of the source code which needs to be fixed.
Reproduce code:
---------------
ext/pgsql/pgsql.c :
function : PHPAPI int php_pgsql_insert(PGconn *pg_link, const char
*table, zval *var_array, ulong opt, char **sql TSRMLS_DC)
line (HERE --> smart_str_appends(&querystr, table);)
Must be something like :
NEW HERE -->
smart_str_appends(&querystr, schema);
smart_str_appends(&querystr, ".");
smart_str_appends(&querystr, table);
the schema name can be obtained from realnamespace collumn (oid) from
table pg_class.
Expected result:
----------------
pg_insert should include the schema name in the insert sql statement.
Actual result:
--------------
the schema name is not specify in sql
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=24679&edit=1