From: mirage at rateaprof dot com
Operating system: Redhat 8
PHP version: 5.0.0RC3
PHP Bug Type: ODBC related
Bug description: odbc_foreignkeys does not return imported keys
Description:
------------
I am running IBM DB2 v8.1 fixpack 5
I am running PHP-5RC2/3 (same php_odbc.c file, no diffs)
If I call:
odbc_foreignkeys ($dbconn, "", "schema", "table", "", "", "");
I get all foreign keys for this table (i.e. I get a list of all other
tables that reference fields in schema.table).
--
In theory, I should be able to:
odbc_foreignkeys ($dbconn, "", "", "", "", "schema", "table")
And in return I get all schema2.table2.column2 names of other tables that
columns in schema.table reference. In otherwords, what keys does this
table reference?
Well it always returns nothing...
--
So is it me, or is it php_odbc.c? Well I went ahead and tested
/opt/IBM/db2/V8.1/samples/cli/tbconstr.c and reversed the arguments for
SQLForeignKeys from ExportedKeys query:
/* get the list of foreign key columns */
cliRC = SQLForeignKeys(hstmt,
NULL,
0,
tbSchema,
SQL_NTS,
tbName,
SQL_NTS,
NULL,
0,
tbSchema,
SQL_NTS,
tbName,
SQL_NTS);
So it would become the following to query ImportedKeys
/* get the list of foreign key columns */
cliRC = SQLForeignKeys(hstmt,
NULL,
0,
NULL,
SQL_NTS,
NULL,
SQL_NTS,
NULL,
0,
tbSchema,
SQL_NTS,
tbName,
SQL_NTS);
Yup it works in the pure C+odbc version... it just doesn't work in php, so
somewhere between the php-odbc_foreignkeys(,...) call and the odbc_php.c,
we lose the return values... I can't tell where since I don't know enough
to debug php... I'd be more than happy to help, but I don't know how.
Can someone see if perhaps return values are being thrown away? Or
arguments to the php call are lost?
--
I did check that the proper dynamic library was being used by running ldd
libphp5.so, and yes it does link to the current v8.1 library...
Reproduce code:
---------------
So I get all the tables with odbc_tables($dbconn, "", "schema", "%", "");
Then to get Exported Keys which works:
$cols = odbc_foreignkeys($dbconn,
odbc_result($tables,1),odbc_result($tables,2), odbc_result($tables,3), "",
"", "") or die(odbc_errormsg());
Then to get Imported Keys which does not work:
$cols = odbc_foreignkeys($dbconn, "", "",
""odbc_result($tables,1),odbc_result($tables,2), odbc_result($tables,3))
or die(odbc_errormsg());
Expected result:
----------------
If jeff.a (a) is a primary key, and jeff.b(d) references jeff.a(a):
jeff.a (a) is exported to jeff.b (d) - Yes this works
jeff.b (d) imports jeff.a (a) - this does not return from the odbc_foreign
keys call for imported keys
Actual result:
--------------
JEFF A TABLE
TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE
TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX
NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB
CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE
NULL JEFF A A 4 INTEGER 10 4 0 10 0
NULL NULL 4 NULL NULL 1 NO
NULL JEFF A B 4 INTEGER 10 4 0 10 1
NULL NULL 4 NULL NULL 2 YES
function result = 2
TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME KEY_SEQ PK_NAME
NULL JEFF A A 1 SQL040707170936160
function result = 1
Exported Keys
.JEFF.A
PKTABLE_CAT PKTABLE_SCHEM PKTABLE_NAME PKCOLUMN_NAME FKTABLE_CAT
FKTABLE_SCHEM FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ UPDATE_RULE DELETE_RULE
FK_NAME PK_NAME DEFERRABILITY
NULL JEFF A A NULL JEFF B D 1 3 3
SQL040707170938220 SQL040707170936160 7
NULL JEFF A A NULL JEFF C AA 1 3 3
SQL040707171829700 SQL040707170936160 7
function result = 2
Imported Keys
.JEFF.A
No rows found
function result = 0
JEFF B TABLE
TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE
TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX
NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB
CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE
NULL JEFF B C 4 INTEGER 10 4 0 10 1
NULL NULL 4 NULL NULL 1 YES
NULL JEFF B D 4 INTEGER 10 4 0 10 1
NULL NULL 4 NULL NULL 2 YES
NULL JEFF B E 4 INTEGER 10 4 0 10 1
NULL NULL 4 NULL NULL 3 YES
function result = 3
No rows found
function result = 0
Exported Keys
.JEFF.B
No rows found
function result = 0
Imported Keys
.JEFF.B
No rows found
function result = 0
--
Edit bug report at http://bugs.php.net/?id=29058&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=29058&r=trysnapshot4
Try a CVS snapshot (php5): http://bugs.php.net/fix.php?id=29058&r=trysnapshot5
Fixed in CVS: http://bugs.php.net/fix.php?id=29058&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=29058&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=29058&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=29058&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=29058&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=29058&r=support
Expected behavior: http://bugs.php.net/fix.php?id=29058&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=29058&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=29058&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=29058&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=29058&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=29058&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=29058&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=29058&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=29058&r=float