From 12567c2bb87bb6fe345355872bf48acc3768d463 Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Tue, 4 Sep 2012 00:05:19 +0800 Subject: [PATCH 1/4] Fixes #50 PostgreSQL describeColumns on table which has multiple columns as primary key will throw exception bug. Added listTables / describeColumns / describeIndexes support schema . Signed-off-by: Rack Lin --- dev/db/adapter/pdo/postgresql.c | 31 +++++++++---------------------- dev/db/dialect/postgresql.c | 26 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/dev/db/adapter/pdo/postgresql.c b/dev/db/adapter/pdo/postgresql.c index ffe23c4b833..12b117a0fb1 100644 --- a/dev/db/adapter/pdo/postgresql.c +++ b/dev/db/adapter/pdo/postgresql.c @@ -234,28 +234,9 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ } } - PHALCON_INIT_VAR(status); - phalcon_fast_strpos_str(status, column_type, SL("(") TSRMLS_CC); - if (PHALCON_IS_NOT_FALSE(status)) { - PHALCON_INIT_VAR(matches); - array_init(matches); - - PHALCON_INIT_VAR(pattern); - ZVAL_STRING(pattern, "#\\(([0-9]+)(,[0-9]+)*\\)#", 1); - Z_SET_ISREF_P(matches); - - PHALCON_INIT_VAR(r0); - PHALCON_CALL_FUNC_PARAMS_3(r0, "preg_match", pattern, column_type, matches); - Z_UNSET_ISREF_P(matches); - if (zend_is_true(r0)) { - eval_int = phalcon_array_isset_long(matches, 1); - if (eval_int) { - PHALCON_INIT_VAR(r1); - phalcon_array_fetch_long(&r1, matches, 1, PH_NOISY_CC); - phalcon_array_update_string(&definition, SL("size"), &r1, PH_COPY | PH_SEPARATE TSRMLS_CC); - } - } - } + PHALCON_INIT_VAR(r0); + phalcon_array_fetch_string(&r0, field, SL("size"), PH_NOISY_CC); + phalcon_array_update_string(&definition, SL("size"), &r0, PH_COPY | PH_SEPARATE TSRMLS_CC); PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("unsigned") TSRMLS_CC); @@ -290,6 +271,12 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ PHALCON_INIT_VAR(column_name); phalcon_array_fetch_string(&column_name, field, SL("field"), PH_NOISY_CC); + // support uuid type and force size to 36 + if (PHALCON_COMPARE_STRING(column_type, "uuid")) { + phalcon_array_update_string_long(&definition, SL("type"), 5, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string_long(&definition, SL("size"), 36, PH_SEPARATE TSRMLS_CC); + } + PHALCON_INIT_VAR(column); object_init_ex(column, phalcon_db_column_ce); PHALCON_CALL_METHOD_PARAMS_2_NORETURN(column, "__construct", column_name, definition, PH_CHECK); diff --git a/dev/db/dialect/postgresql.c b/dev/db/dialect/postgresql.c index 0ce98c69075..76f93ec330d 100644 --- a/dev/db/dialect/postgresql.c +++ b/dev/db/dialect/postgresql.c @@ -442,8 +442,12 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, describeColumns){ } PHALCON_INIT_VAR(sql); - PHALCON_CONCAT_SVSVS(sql, "SELECT a.attname AS Field, format_type(a.atttypid, a.atttypmod) AS Type, CASE WHEN attnotnull=false THEN 'YES' ELSE 'NO' END AS Null, CASE WHEN (select cc.contype FROM pg_catalog.pg_constraint cc WHERE cc.conrelid = c.oid AND cc.conkey[1] = a.attnum)='p' THEN 'PRI' ELSE '' END AS Key, CASE WHEN t.typname LIKE '%int%' AND (SELECT column_default FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '", table, "' AND column_name = a.attname) LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra FROM pg_catalog.pg_Class c, pg_catalog.pg_attribute a, pg_catalog.pg_type t WHERE c.relname = '", table, "' AND c.oid = a.attrelid AND a.attnum > 0 AND c.relhaspkey = 't' AND t.oid = a.atttypid ORDER BY a.attnum"); - + if (zend_is_true(schema)) { + PHALCON_CONCAT_SVSVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='", schema, "' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); + } else { + PHALCON_CONCAT_SVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='public' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); + } + RETURN_CTOR(sql); } @@ -470,10 +474,14 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, listTables){ PHALCON_ALLOC_ZVAL_MM(schema_name); ZVAL_NULL(schema_name); } - + PHALCON_INIT_VAR(sql); - ZVAL_STRING(sql, "SELECT c.relname AS table_name FROM pg_Class c, pg_user u WHERE c.relowner = u.usesysid AND c.relkind = 'r' AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) AND c.relname !~ '^(pg_|sql_)' UNION SELECT c.relname AS table_name FROM pg_Class c WHERE c.relkind = 'r' AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) AND c.relname !~ '^pg_' ORDER BY 1", 1); - + if (zend_is_true(schema_name)) { + PHALCON_CONCAT_SVS(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = '", schema_name, "'"); + } else { + ZVAL_STRING(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'", 1); + } + RETURN_CTOR(sql); } @@ -501,8 +509,12 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, describeIndexes){ } PHALCON_INIT_VAR(sql); - PHALCON_CONCAT_SVS(sql, "SELECT t.relname as table_name, i.relname as key_name, a.attname as column_name FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND t.relkind = 'r' AND t.relname = '", table, "' ORDER BY t.relname, i.relname;"); - + if (zend_is_true(schema)) { + PHALCON_CONCAT_SVSVS(sql, "SELECT table_name,constraint_name AS key_name,column_name FROM information_schema.key_column_usage WHERE table_name='", table, "' AND table_schema='", schema, "' ORDER BY ordinal_position"); + } else { + PHALCON_CONCAT_SVS(sql, "SELECT table_name,constraint_name AS key_name,column_name FROM information_schema.key_column_usage WHERE table_name='", table, "' AND table_schema='public' ORDER BY ordinal_position"); + } + RETURN_CTOR(sql); } From 02468321bd1c3151a8e752f459d296cf5a876dad Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Tue, 4 Sep 2012 01:10:06 +0800 Subject: [PATCH 2/4] Fixed listTables not order by table_name bugs. Signed-off-by: Rack Lin --- dev/db/dialect/postgresql.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/db/dialect/postgresql.c b/dev/db/dialect/postgresql.c index 76f93ec330d..bb7cb1c659f 100644 --- a/dev/db/dialect/postgresql.c +++ b/dev/db/dialect/postgresql.c @@ -477,9 +477,9 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, listTables){ PHALCON_INIT_VAR(sql); if (zend_is_true(schema_name)) { - PHALCON_CONCAT_SVS(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = '", schema_name, "'"); + PHALCON_CONCAT_SVS(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = '", schema_name, "' ORDER BY table_name"); } else { - ZVAL_STRING(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'", 1); + ZVAL_STRING(sql, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name", 1); } RETURN_CTOR(sql); From 5c9e62820180f3abe98c80234a99ddac78bfde2f Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Tue, 4 Sep 2012 01:58:15 +0800 Subject: [PATCH 3/4] Fixed testDbPostgresql unit test to support schema. Signed-off-by: Rack Lin --- unit-tests/DbDescribeTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unit-tests/DbDescribeTest.php b/unit-tests/DbDescribeTest.php index 6b6e66fcca6..f0c1274491d 100644 --- a/unit-tests/DbDescribeTest.php +++ b/unit-tests/DbDescribeTest.php @@ -442,7 +442,7 @@ public function testDbPostgresql() $tables = $connection->listTables(); $this->assertEquals($tables, $expectedTables); - $tables = $connection->listTables('phalcon_test'); + $tables = $connection->listTables('public'); $this->assertEquals($tables, $expectedTables); //Table exist @@ -479,7 +479,7 @@ public function testDbPostgresql() $describeIndexes = $connection->describeIndexes('robots_parts'); $this->assertEquals($describeIndexes, $expectedIndexes); - $describeIndexes = $connection->describeIndexes('robots_parts', 'phalcon_test'); + $describeIndexes = $connection->describeIndexes('robots_parts', 'public'); $this->assertEquals($describeIndexes, $expectedIndexes); //References @@ -503,7 +503,7 @@ public function testDbPostgresql() $describeReferences = $connection->describeReferences('robots_parts'); $this->assertEquals($describeReferences, $expectedReferences); - $describeReferences = $connection->describeReferences('robots_parts', 'phalcon_test'); + $describeReferences = $connection->describeReferences('robots_parts', 'public'); $this->assertEquals($describeReferences, $expectedReferences); /**/ From 5b3e354e3e629ed5802db5c097ac203924f91dcb Mon Sep 17 00:00:00 2001 From: Rack Lin Date: Tue, 4 Sep 2012 10:58:00 +0800 Subject: [PATCH 4/4] Fixed PostgreSQL describeColumns column size issues and describeIndexes bugs. Signed-off-by: Rack Lin --- dev/db/adapter/pdo/postgresql.c | 35 ++++++++++++++++++++++----------- dev/db/dialect/postgresql.c | 13 ++++++------ unit-tests/DbDescribeTest.php | 4 ++-- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/dev/db/adapter/pdo/postgresql.c b/dev/db/adapter/pdo/postgresql.c index 12b117a0fb1..64cac6578a6 100644 --- a/dev/db/adapter/pdo/postgresql.c +++ b/dev/db/adapter/pdo/postgresql.c @@ -125,6 +125,7 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ zval *matches = NULL, *pattern = NULL, *column_name = NULL, *column = NULL; zval *t0 = NULL, *t1 = NULL; zval *r0 = NULL, *r1 = NULL, *r2 = NULL, *r3 = NULL, *r4 = NULL; + zval *char_size = NULL, *numeric_size = NULL; HashTable *ah0; HashPosition hp0; zval **hd; @@ -181,50 +182,72 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ PHALCON_INIT_VAR(column_type); phalcon_array_fetch_string(&column_type, field, SL("type"), PH_NOISY_CC); + PHALCON_INIT_VAR(char_size); + phalcon_array_fetch_string(&char_size, field, SL("size"), PH_NOISY_CC); + + PHALCON_INIT_VAR(numeric_size); + phalcon_array_fetch_string(&numeric_size, field, SL("numericsize"), PH_NOISY_CC); + PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("int") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 0, PH_SEPARATE TSRMLS_CC); phalcon_array_update_string_bool(&definition, SL("isNumeric"), 1, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &numeric_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("varying") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 2, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &char_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("date") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 1, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string_long(&definition, SL("size"), 0, PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("numeric") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 3, PH_SEPARATE TSRMLS_CC); phalcon_array_update_string_bool(&definition, SL("isNumeric"), 1, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &numeric_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("char") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 5, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &char_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("timestamp") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 4, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string_long(&definition, SL("size"), 0, PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("text") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 6, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &char_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("float") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { phalcon_array_update_string_long(&definition, SL("type"), 7, PH_SEPARATE TSRMLS_CC); phalcon_array_update_string_bool(&definition, SL("isNumeric"), 1, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &numeric_size, PH_COPY | PH_SEPARATE TSRMLS_CC); } else { - phalcon_array_update_string_long(&definition, SL("type"), 2, PH_SEPARATE TSRMLS_CC); + PHALCON_INIT_VAR(status); + phalcon_fast_strpos_str(status, column_type, SL("uuid") TSRMLS_CC); + if (PHALCON_IS_NOT_FALSE(status)) { + phalcon_array_update_string_long(&definition, SL("type"), 5, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string_long(&definition, SL("size"), 36, PH_SEPARATE TSRMLS_CC); + } else { + phalcon_array_update_string_long(&definition, SL("type"), 2, PH_SEPARATE TSRMLS_CC); + phalcon_array_update_string(&definition, SL("size"), &char_size, PH_COPY | PH_SEPARATE TSRMLS_CC); + } } } } @@ -234,10 +257,6 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ } } - PHALCON_INIT_VAR(r0); - phalcon_array_fetch_string(&r0, field, SL("size"), PH_NOISY_CC); - phalcon_array_update_string(&definition, SL("size"), &r0, PH_COPY | PH_SEPARATE TSRMLS_CC); - PHALCON_INIT_VAR(status); phalcon_fast_strpos_str(status, column_type, SL("unsigned") TSRMLS_CC); if (PHALCON_IS_NOT_FALSE(status)) { @@ -271,12 +290,6 @@ PHP_METHOD(Phalcon_Db_Adapter_Pdo_Postgresql, describeColumns){ PHALCON_INIT_VAR(column_name); phalcon_array_fetch_string(&column_name, field, SL("field"), PH_NOISY_CC); - // support uuid type and force size to 36 - if (PHALCON_COMPARE_STRING(column_type, "uuid")) { - phalcon_array_update_string_long(&definition, SL("type"), 5, PH_SEPARATE TSRMLS_CC); - phalcon_array_update_string_long(&definition, SL("size"), 36, PH_SEPARATE TSRMLS_CC); - } - PHALCON_INIT_VAR(column); object_init_ex(column, phalcon_db_column_ce); PHALCON_CALL_METHOD_PARAMS_2_NORETURN(column, "__construct", column_name, definition, PH_CHECK); diff --git a/dev/db/dialect/postgresql.c b/dev/db/dialect/postgresql.c index bb7cb1c659f..8bba7c7454c 100644 --- a/dev/db/dialect/postgresql.c +++ b/dev/db/dialect/postgresql.c @@ -443,9 +443,9 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, describeColumns){ PHALCON_INIT_VAR(sql); if (zend_is_true(schema)) { - PHALCON_CONCAT_SVSVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='", schema, "' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); + PHALCON_CONCAT_SVSVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.numeric_precision AS NumericSize, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='", schema, "' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); } else { - PHALCON_CONCAT_SVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='public' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); + PHALCON_CONCAT_SVS(sql, "SELECT DISTINCT c.column_name AS Field, c.data_type AS Type, c.character_maximum_length AS Size, c.numeric_precision AS NumericSize, c.is_nullable AS Null, CASE WHEN pkc.column_name NOTNULL THEN 'PRI' ELSE '' END AS Key, CASE WHEN c.data_type LIKE '%int%' AND c.column_default LIKE '%nextval%' THEN 'auto_increment' ELSE '' END AS Extra, c.ordinal_position AS Position FROM information_schema.columns c LEFT JOIN ( SELECT kcu.column_name, kcu.table_name, kcu.table_schema FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu on (kcu.constraint_name = tc.constraint_name and kcu.table_name=tc.table_name and kcu.table_schema=tc.table_schema) WHERE tc.constraint_type='PRIMARY KEY') pkc ON (c.column_name=pkc.column_name AND c.table_schema = pkc.table_schema AND c.table_name=pkc.table_name) WHERE c.table_schema='public' AND c.table_name='", table, "' ORDER BY c.ordinal_position"); } RETURN_CTOR(sql); @@ -510,9 +510,9 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, describeIndexes){ PHALCON_INIT_VAR(sql); if (zend_is_true(schema)) { - PHALCON_CONCAT_SVSVS(sql, "SELECT table_name,constraint_name AS key_name,column_name FROM information_schema.key_column_usage WHERE table_name='", table, "' AND table_schema='", schema, "' ORDER BY ordinal_position"); + PHALCON_CONCAT_SVSVS(sql, "SELECT n.nspname as table_schema, t.relname as table_name, i.relname as key_name, a.attname as column_name FROM pg_class t, pg_class i, pg_index ix, pg_attribute a, pg_namespace n WHERE t.relnamespace=n.oid AND t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND t.relkind = 'r' AND t.relname = '", table, "' AND n.nspname = '", schema, "' ORDER BY t.relname, i.relname"); } else { - PHALCON_CONCAT_SVS(sql, "SELECT table_name,constraint_name AS key_name,column_name FROM information_schema.key_column_usage WHERE table_name='", table, "' AND table_schema='public' ORDER BY ordinal_position"); + PHALCON_CONCAT_SVS(sql, "SELECT n.nspname as table_schema, t.relname as table_name, i.relname as key_name, a.attname as column_name FROM pg_class t, pg_class i, pg_index ix, pg_attribute a, pg_namespace n WHERE t.relnamespace=n.oid AND t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND t.relkind = 'r' AND t.relname = '", table, "' AND n.nspname = 'public' ORDER BY t.relname, i.relname"); } RETURN_CTOR(sql); @@ -546,15 +546,14 @@ PHP_METHOD(Phalcon_Db_Dialect_Postgresql, describeReferences){ ZVAL_STRING(sql, "SELECT tc.table_name as TABLE_NAME, kcu.column_name as COLUMN_NAME, tc.constraint_name as CONSTRAINT_NAME, tc.table_catalog as REFERENCED_TABLE_SCHEMA, ccu.table_name AS REFERENCED_TABLE_NAME, ccu.column_name AS REFERENCED_COLUMN_NAME FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name WHERE constraint_type = 'FOREIGN KEY' AND ", 1); if (zend_is_true(schema)) { PHALCON_ALLOC_ZVAL_MM(r0); - PHALCON_CONCAT_SVSVS(r0, "tc.table_catalog = '", schema, "' AND tc.table_name='", table, "'"); + PHALCON_CONCAT_SVSVS(r0, "tc.table_schema = '", schema, "' AND tc.table_name='", table, "'"); phalcon_concat_self(&sql, r0 TSRMLS_CC); } else { PHALCON_ALLOC_ZVAL_MM(r1); PHALCON_CONCAT_SVS(r1, "tc.table_name='", table, "'"); phalcon_concat_self(&sql, r1 TSRMLS_CC); } - - + RETURN_CTOR(sql); } diff --git a/unit-tests/DbDescribeTest.php b/unit-tests/DbDescribeTest.php index f0c1274491d..290f356b973 100644 --- a/unit-tests/DbDescribeTest.php +++ b/unit-tests/DbDescribeTest.php @@ -192,7 +192,7 @@ public function getExpectedColumns($adapter) '_schemaName' => NULL, '_type' => 0, '_isNumeric' => true, - '_size' => 0, + '_size' => 32, '_scale' => 0, '_unsigned' => false, '_notNull' => true, @@ -270,7 +270,7 @@ public function getExpectedColumns($adapter) '_schemaName' => NULL, '_type' => 0, '_isNumeric' => true, - '_size' => 0, + '_size' => 32, '_scale' => 0, '_unsigned' => false, '_notNull' => false,