Details
Description
I have the folowing table structure:
Schema "public": with one table called "users"
Schema "forums": with one table called "users"
methods like PostgreSqlPlatform::getListTableForeignKeysSQL($table, $database = '') should list FK inside $table
the default search path is "public,pg_catalog"
calling PostgreSqlPlatform::getListTableForeignKeysSQL('users') it shuld extract the FK from public.users table, but this is the current result:
[PDOException] SQLSTATE[21000]: Cardinality violation: 7 ERROR: more than one row returned by a subquery used as an expression
this exception is thrown because PostgreSqlPlatform::getTableWhereClause do not cosider the current search path.
i propose the following implementation for PostgreSqlPlatform::getTableWhereClause
private function getTableWhereClause($table, $classAlias = 'c', $namespaceAlias = 'n')
{
$whereClause = $namespaceAlias.".nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND ";
if (strpos($table, ".") !== false) {
list($schema, $table) = explode(".", $table);
$whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = '" . $schema . "'";
} else {
// $whereClause .= "$classAlias.relname = '" . $table . "'"; // this was the current implementation
$whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = ANY(string_to_array((select setting from pg_catalog.pg_settings where name = 'search_path'),','))";
}
return $whereClause;
}
this implementation will restrict the search range only to current "search_path".
(sorry for my english)
Activity
| Field | Original Value | New Value |
|---|---|---|
| Description |
I have the folowing table structure: Schema "public": with one table called "users" Schema "forums": with one table called "users" methods like {{PostgreSqlPlatform::getListTableForeignKeysSQL($table, $database = '')}} should list FK inside {{$table}} the default search path is "public,pg_catalog" calling {{PostgreSqlPlatform::getListTableForeignKeysSQL('users')}} it shuld extract the FK from {{public.users}} table, but this is the current result: {{[PDOException] SQLSTATE[21000]: Cardinality violation: 7 ERROR: more than one row returned by a subquery used as an expression}} this exception is thrown because {{PostgreSqlPlatform::getTableWhereClause}} do not cosider the current search path. i propose the following implementation for {{PostgreSqlPlatform::getTableWhereClause}} {code:java} private function getTableWhereClause($table, $classAlias = 'c', $namespaceAlias = 'n') { $whereClause = $namespaceAlias.".nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND "; if (strpos($table, ".") !== false) { list($schema, $table) = explode(".", $table); $whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = '" . $schema . "'"; } else { // $whereClause .= "$classAlias.relname = '" . $table . "'"; // this was the current implementation $whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = ANY(string_to_array((select setting from pg_catalog.pg_settings where name = 'search_path'),','))"; } return $whereClause; } {code} this implementation will restrict the search range only to current "search_path". (sorry for my italian) |
I have the folowing table structure: Schema "public": with one table called "users" Schema "forums": with one table called "users" methods like {{PostgreSqlPlatform::getListTableForeignKeysSQL($table, $database = '')}} should list FK inside {{$table}} the default search path is "public,pg_catalog" calling {{PostgreSqlPlatform::getListTableForeignKeysSQL('users')}} it shuld extract the FK from {{public.users}} table, but this is the current result: {{[PDOException] SQLSTATE[21000]: Cardinality violation: 7 ERROR: more than one row returned by a subquery used as an expression}} this exception is thrown because {{PostgreSqlPlatform::getTableWhereClause}} do not cosider the current search path. i propose the following implementation for {{PostgreSqlPlatform::getTableWhereClause}} {code:java} private function getTableWhereClause($table, $classAlias = 'c', $namespaceAlias = 'n') { $whereClause = $namespaceAlias.".nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND "; if (strpos($table, ".") !== false) { list($schema, $table) = explode(".", $table); $whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = '" . $schema . "'"; } else { // $whereClause .= "$classAlias.relname = '" . $table . "'"; // this was the current implementation $whereClause .= "$classAlias.relname = '" . $table . "' AND $namespaceAlias.nspname = ANY(string_to_array((select setting from pg_catalog.pg_settings where name = 'search_path'),','))"; } return $whereClause; } {code} this implementation will restrict the search range only to current "search_path". (sorry for my english) |
| Status | Open [ 1 ] | Resolved [ 5 ] |
| Fix Version/s | 2.1.6 [ 10181 ] | |
| Fix Version/s | 2.2 [ 10142 ] | |
| Resolution | Fixed [ 1 ] |
| Workflow | jira [ 13392 ] | jira-feedback2 [ 17787 ] |
| Workflow | jira-feedback2 [ 17787 ] | jira-feedback3 [ 20142 ] |