tdf#122437 mysqlc: Fix foreign key references
Comparing mysqlc terminology (INFORMATION_SCHEMA) with the description
of the XDatabaseMetadata interface:
- columns with name "REFERENCED_*" (INF_SCHEMA) should be used for primary key
attributes (sdbc terminology).
- columns without any prefix (INF_SCHEMA) should be used for primary key
attributes (sdbc)
Change-Id: Id9780fd86834441485da927f85b9446c40951fcf
Reviewed-on: https://gerrit.libreoffice.org/66213
Tested-by: Jenkins
Reviewed-by: Tamás Bunth <btomi96@gmail.com>
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx
index 419d8e7a..370d963 100644
--- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx
+++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx
@@ -928,18 +928,23 @@
"org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
UNO_QUERY);
OUString query(
"SELECT refi.CONSTRAINT_CATALOG, k.COLUMN_NAME, "
" refi.UNIQUE_CONSTRAINT_CATALOG, "
" refi.UNIQUE_CONSTRAINT_SCHEMA, refi.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME, "
" refi.UPDATE_RULE, refi.DELETE_RULE, refi.CONSTRAINT_NAME "
" FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as refi"
" INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as k ON k.CONSTRAINT_NAME = "
"refi.CONSTRAINT_NAME "
" and k.TABLE_NAME = refi.TABLE_NAME "
" WHERE refi.CONSTRAINT_SCHEMA LIKE "
"'?' AND refi.TABLE_NAME='?'"); // TODO
query = query.replaceFirst("?", schema);
OUString query("SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog
" k.COLUMN_NAME," // 2: foreign column name
" refi.UNIQUE_CONSTRAINT_CATALOG," // 3: primary catalog FIXME
" k.REFERENCED_TABLE_SCHEMA," // 4: primary schema
" refi.REFERENCED_TABLE_NAME," // 5: primary table name
" k.REFERENCED_COLUMN_NAME," // 6: primary column name
" refi.UPDATE_RULE, refi.DELETE_RULE," // 7,8: update, delete rule
" refi.CONSTRAINT_NAME, " // 9: name of constraint itself
" refi.TABLE_NAME, " // 10: foreign table name
" refi.CONSTRAINT_SCHEMA " // 11: foreign schema name FIXME
" FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as refi"
" INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as k ON k.CONSTRAINT_NAME = "
"refi.CONSTRAINT_NAME "
" and k.TABLE_NAME = refi.TABLE_NAME "
" WHERE k.REFERENCED_TABLE_SCHEMA LIKE "
"'?' AND refi.TABLE_NAME='?'");
query = query.replaceFirst("?", schema); // TODO what if schema is NULL?
query = query.replaceFirst("?", table);
std::vector<std::vector<Any>> aRows;
@@ -952,22 +957,22 @@
std::vector<Any> aRow{ Any() }; // 0. element is unused
// primary key catalog
aRow.push_back(makeAny(xRow->getString(1)));
aRow.push_back(makeAny(xRow->getString(3)));
// primary key schema
aRow.push_back(makeAny(schema));
aRow.push_back(makeAny(xRow->getString(4)));
// primary key table
aRow.push_back(makeAny(table));
aRow.push_back(makeAny(xRow->getString(5)));
// primary column name
aRow.push_back(makeAny(xRow->getString(2)));
aRow.push_back(makeAny(xRow->getString(6)));
// fk table catalog
aRow.push_back(makeAny(xRow->getString(3)));
aRow.push_back(makeAny(xRow->getString(1)));
// fk schema
aRow.push_back(makeAny(xRow->getString(4)));
aRow.push_back(makeAny(xRow->getString(11)));
// fk table
aRow.push_back(makeAny(xRow->getString(5)));
aRow.push_back(makeAny(xRow->getString(10)));
// fk column name
aRow.push_back(makeAny(xRow->getString(6)));
aRow.push_back(makeAny(xRow->getString(2)));
// KEY_SEQ
aRow.push_back(makeAny(sal_Int32{ 0 })); // TODO
// update rule