diff options
author | Tamas Bunth <tamas.bunth@collabora.co.uk> | 2019-01-12 12:41:05 +0100 |
---|---|---|
committer | Tamás Bunth <btomi96@gmail.com> | 2019-01-12 17:25:07 +0100 |
commit | 316f85fa1d0617064a9908dc336586332e9375ae (patch) | |
tree | 691e30fcfb3279720b97487a8e0ef1dcad9834d3 /connectivity | |
parent | 84fefd7c295fc05499ca222dff50c2fe4e0fb27e (diff) |
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>
Diffstat (limited to 'connectivity')
-rw-r--r-- | connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx index 419d8e7acb9e..370d9635c4e9 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx @@ -928,18 +928,23 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c "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 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c 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 |