mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-04-05 20:31:00 +08:00
Postgres: No namespace in INDEX, CONSTRAINT names
src/libmdb/backend.c:mdb_print_indexes() and src/libmdb/backend.c:mdb_get_relationships(): In PostgreSQL the INDEX names explicitly must not have a namespace name on them; they are always created in the namespace of the table. See: http://www.postgresql.org/docs/current/static/sql-createindex.html which says: "The name of the index to be created. No schema name can be included here; the index is always created in the same schema as its parent table." By observation the same is true for CONSTRAINT names; they are refused if the namespace is included before them. Also omit the namespace from the FOREIGN KEY constraint _column_ names on PostgreSQL (it's not clear that the _column_ names should ever be namespaced, but behaviour should currently be unchanged for databases other than PostgreSQL).
This commit is contained in:
parent
307cc50dc0
commit
c13bcc75a7
@ -558,7 +558,20 @@ mdb_print_indexes(FILE* outfile, MdbTableDef *table, char *dbnamespace)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
index_name = mdb_get_index_name(backend, table, idx);
|
index_name = mdb_get_index_name(backend, table, idx);
|
||||||
quoted_name = mdb->default_backend->quote_schema_name(dbnamespace, index_name);
|
switch (backend) {
|
||||||
|
case MDB_BACKEND_POSTGRES:
|
||||||
|
/* PostgreSQL index and constraint names are
|
||||||
|
* never namespaced in DDL (they are always
|
||||||
|
* created in same namespace as table), so
|
||||||
|
* omit namespace.
|
||||||
|
*/
|
||||||
|
quoted_name = mdb->default_backend->quote_schema_name(NULL, index_name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
quoted_name = mdb->default_backend->quote_schema_name(dbnamespace, index_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (idx->index_type==1) {
|
if (idx->index_type==1) {
|
||||||
switch (backend) {
|
switch (backend) {
|
||||||
case MDB_BACKEND_ORACLE:
|
case MDB_BACKEND_ORACLE:
|
||||||
@ -688,12 +701,32 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl
|
|||||||
}
|
}
|
||||||
|
|
||||||
quoted_table_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[1]);
|
quoted_table_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[1]);
|
||||||
quoted_column_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[0]);
|
|
||||||
quoted_table_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[3]);
|
quoted_table_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[3]);
|
||||||
quoted_column_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[2]);
|
|
||||||
grbit = atoi(bound[4]);
|
grbit = atoi(bound[4]);
|
||||||
constraint_name = g_strconcat(bound[1], "_", bound[0], "_fk", NULL);
|
constraint_name = g_strconcat(bound[1], "_", bound[0], "_fk", NULL);
|
||||||
quoted_constraint_name = mdb->default_backend->quote_schema_name(dbnamespace, constraint_name);
|
|
||||||
|
switch (backend) {
|
||||||
|
case MDB_BACKEND_POSTGRES:
|
||||||
|
/* PostgreSQL index and constraint names are
|
||||||
|
* never namespaced in DDL (they are always
|
||||||
|
* created in same namespace as table), so
|
||||||
|
* omit namespace. Nor should column names
|
||||||
|
* be namespaced.
|
||||||
|
*/
|
||||||
|
quoted_constraint_name = mdb->default_backend->quote_schema_name(NULL, constraint_name);
|
||||||
|
quoted_column_1 = mdb->default_backend->quote_schema_name(NULL, bound[0]);
|
||||||
|
quoted_column_2 = mdb->default_backend->quote_schema_name(NULL, bound[2]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Other databases, namespace constraint and
|
||||||
|
* column names.
|
||||||
|
*/
|
||||||
|
quoted_constraint_name = mdb->default_backend->quote_schema_name(dbnamespace, constraint_name);
|
||||||
|
quoted_column_1 = mdb->default_backend->quote_schema_name(dbnamespace, bound[0]);
|
||||||
|
quoted_column_2 = mdb->default_backend->quote_schema_name(dbnamespace, bound[2]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
g_free(constraint_name);
|
g_free(constraint_name);
|
||||||
|
|
||||||
if (grbit & 0x00000002) {
|
if (grbit & 0x00000002) {
|
||||||
@ -727,6 +760,28 @@ mdb_get_relationships(MdbHandle *mdb, const gchar *dbnamespace, const char* tabl
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* On some databases (eg PostgreSQL) we also want to set
|
||||||
|
* the constraints to be optionally deferrable, to
|
||||||
|
* facilitate out of order bulk loading.
|
||||||
|
*/
|
||||||
|
switch (backend) {
|
||||||
|
case MDB_BACKEND_POSTGRES:
|
||||||
|
{
|
||||||
|
gchar *add_constraint;
|
||||||
|
add_constraint = text;
|
||||||
|
text = g_strconcat(add_constraint,
|
||||||
|
"ALTER TABLE ", quoted_table_1,
|
||||||
|
" ALTER CONSTRAINT ",
|
||||||
|
quoted_constraint_name,
|
||||||
|
" DEFERRABLE"
|
||||||
|
" INITIALLY IMMEDIATE;\n",
|
||||||
|
NULL);
|
||||||
|
g_free(add_constraint);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g_free(quoted_table_1);
|
g_free(quoted_table_1);
|
||||||
g_free(quoted_column_1);
|
g_free(quoted_column_1);
|
||||||
|
Loading…
Reference in New Issue
Block a user