return'SHOW INDEX FROM '+this.quoteTable(tableName)+((options||{}).database?' FROM `'+options.database+'`':'');
return'SHOW INDEX FROM '+this.quoteTable(tableName)+((options||{}).database?' FROM `'+options.database+'`':'');
},
},
showConstraintsQuery(tableName,constraintName){
showConstraintsQuery(table,constraintName){
consttableName=table.tableName||table;
constschemaName=table.schema;
letsql=[
letsql=[
'SELECT CONSTRAINT_CATALOG AS constraintCatalog,',
'SELECT CONSTRAINT_CATALOG AS constraintCatalog,',
'CONSTRAINT_NAME AS constraintName,',
'CONSTRAINT_NAME AS constraintName,',
...
@@ -290,6 +293,10 @@ const QueryGenerator = {
...
@@ -290,6 +293,10 @@ const QueryGenerator = {
sql+=` AND constraint_name = '${constraintName}'`;
sql+=` AND constraint_name = '${constraintName}'`;
}
}
if(schemaName){
sql+=` AND TABLE_SCHEMA = '${schemaName}'`;
}
returnsql+';';
returnsql+';';
},
},
...
@@ -473,6 +480,27 @@ const QueryGenerator = {
...
@@ -473,6 +480,27 @@ const QueryGenerator = {
return`(${quotedColumn}->>'${pathStr}')`;
return`(${quotedColumn}->>'${pathStr}')`;
},
},
/**
* Generates fields for getForeignKeysQuery
* @returns {String} fields
* @private
*/
_getForeignKeysQueryFields(){
return[
'CONSTRAINT_NAME as constraint_name',
'CONSTRAINT_NAME as constraintName',
'CONSTRAINT_SCHEMA as constraintSchema',
'CONSTRAINT_SCHEMA as constraintCatalog',
'TABLE_NAME as tableName',
'TABLE_SCHEMA as tableSchema',
'TABLE_SCHEMA as tableCatalog',
'COLUMN_NAME as columnName',
'REFERENCED_TABLE_SCHEMA as referencedTableSchema',
'REFERENCED_TABLE_SCHEMA as referencedTableCatalog',
'REFERENCED_TABLE_NAME as referencedTableName',
'REFERENCED_COLUMN_NAME as referencedColumnName',
].join(',');
},
/**
/**
* Generates an SQL query that returns all foreign keys of a table.
* Generates an SQL query that returns all foreign keys of a table.
...
@@ -483,8 +511,8 @@ const QueryGenerator = {
...
@@ -483,8 +511,8 @@ const QueryGenerator = {
* @private
* @private
*/
*/
getForeignKeysQuery(tableName,schemaName){
getForeignKeysQuery(tableName,schemaName){
return"SELECT CONSTRAINT_NAME as constraint_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '"+tableName+/* jshint ignore: line */
return'SELECT '+this._getForeignKeysQueryFields()+' FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = \''+tableName+/* jshint ignore: line */
"' AND CONSTRAINT_NAME!='PRIMARY' AND CONSTRAINT_SCHEMA='"+schemaName+"' AND REFERENCED_TABLE_NAME IS NOT NULL;";/* jshint ignore: line */
'\' AND CONSTRAINT_NAME!=\'PRIMARY\' AND CONSTRAINT_SCHEMA=\''+schemaName+'\' AND REFERENCED_TABLE_NAME IS NOT NULL;';/* jshint ignore: line */
},
},
/**
/**
...
@@ -496,15 +524,16 @@ const QueryGenerator = {
...
@@ -496,15 +524,16 @@ const QueryGenerator = {
* @private
* @private
*/
*/
getForeignKeyQuery(table,columnName){
getForeignKeyQuery(table,columnName){
lettableName=table.tableName||table;
consttableName=table.tableName||table;
if(table.schema){
constschemaName=table.schema;
tableName=table.schema+'.'+tableName;
}
return'SELECT '+this._getForeignKeysQueryFields()
return'SELECT CONSTRAINT_NAME as constraint_name'
+' FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE'
+' FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE'
+' WHERE (REFERENCED_TABLE_NAME = '+wrapSingleQuote(tableName)
+' WHERE (REFERENCED_TABLE_NAME = '+wrapSingleQuote(tableName)
+(schemaName?' AND REFERENCED_TABLE_SCHEMA = '+wrapSingleQuote(schemaName):'')
+' AND REFERENCED_COLUMN_NAME = '+wrapSingleQuote(columnName)
+' AND REFERENCED_COLUMN_NAME = '+wrapSingleQuote(columnName)
+') OR (TABLE_NAME = '+wrapSingleQuote(tableName)
+') OR (TABLE_NAME = '+wrapSingleQuote(tableName)
+(schemaName?' AND TABLE_SCHEMA = '+wrapSingleQuote(schemaName):'')
+' AND COLUMN_NAME = '+wrapSingleQuote(columnName)
+' AND COLUMN_NAME = '+wrapSingleQuote(columnName)
mssql:"SELECT constraint_name = C.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS C WHERE C.CONSTRAINT_TYPE = 'FOREIGN KEY' AND C.TABLE_NAME = 'myTable'"
mssql:"SELECT constraint_name = OBJ.NAME, constraintName = OBJ.NAME, constraintSchema = SCHEMA_NAME(OBJ.SCHEMA_ID), tableName = TB.NAME, tableSchema = SCHEMA_NAME(TB.SCHEMA_ID), columnName = COL.NAME, referencedTableSchema = SCHEMA_NAME(RTB.SCHEMA_ID), referencedTableName = RTB.NAME, referencedColumnName = RCOL.NAME FROM SYS.FOREIGN_KEY_COLUMNS FKC INNER JOIN SYS.OBJECTS OBJ ON OBJ.OBJECT_ID = FKC.CONSTRAINT_OBJECT_ID INNER JOIN SYS.TABLES TB ON TB.OBJECT_ID = FKC.PARENT_OBJECT_ID INNER JOIN SYS.COLUMNS COL ON COL.COLUMN_ID = PARENT_COLUMN_ID AND COL.OBJECT_ID = TB.OBJECT_ID INNER JOIN SYS.TABLES RTB ON RTB.OBJECT_ID = FKC.REFERENCED_OBJECT_ID INNER JOIN SYS.COLUMNS RCOL ON RCOL.COLUMN_ID = REFERENCED_COLUMN_ID AND RCOL.OBJECT_ID = RTB.OBJECT_ID WHERE TB.NAME ='myTable'"
mssql:"SELECT constraint_name = TC.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME WHERE TC.CONSTRAINT_TYPE = 'FOREIGN KEY' AND TC.TABLE_NAME = 'myTable' AND CCU.COLUMN_NAME = 'myColumn'"
mssql:"SELECT constraint_name = OBJ.NAME, constraintName = OBJ.NAME, constraintSchema = SCHEMA_NAME(OBJ.SCHEMA_ID), tableName = TB.NAME, tableSchema = SCHEMA_NAME(TB.SCHEMA_ID), columnName = COL.NAME, referencedTableSchema = SCHEMA_NAME(RTB.SCHEMA_ID), referencedTableName = RTB.NAME, referencedColumnName = RCOL.NAME FROM SYS.FOREIGN_KEY_COLUMNS FKC INNER JOIN SYS.OBJECTS OBJ ON OBJ.OBJECT_ID = FKC.CONSTRAINT_OBJECT_ID INNER JOIN SYS.TABLES TB ON TB.OBJECT_ID = FKC.PARENT_OBJECT_ID INNER JOIN SYS.COLUMNS COL ON COL.COLUMN_ID = PARENT_COLUMN_ID AND COL.OBJECT_ID = TB.OBJECT_ID INNER JOIN SYS.TABLES RTB ON RTB.OBJECT_ID = FKC.REFERENCED_OBJECT_ID INNER JOIN SYS.COLUMNS RCOL ON RCOL.COLUMN_ID = REFERENCED_COLUMN_ID AND RCOL.OBJECT_ID = RTB.OBJECT_ID WHERE TB.NAME ='myTable' AND COL.NAME ='myColumn'"
});
expectsql(QueryGenerator.getForeignKeyQuery({
tableName:'myTable',
schema:'mySchema'
},'myColumn'),{
mssql:"SELECT constraint_name = OBJ.NAME, constraintName = OBJ.NAME, constraintSchema = SCHEMA_NAME(OBJ.SCHEMA_ID), tableName = TB.NAME, tableSchema = SCHEMA_NAME(TB.SCHEMA_ID), columnName = COL.NAME, referencedTableSchema = SCHEMA_NAME(RTB.SCHEMA_ID), referencedTableName = RTB.NAME, referencedColumnName = RCOL.NAME FROM SYS.FOREIGN_KEY_COLUMNS FKC INNER JOIN SYS.OBJECTS OBJ ON OBJ.OBJECT_ID = FKC.CONSTRAINT_OBJECT_ID INNER JOIN SYS.TABLES TB ON TB.OBJECT_ID = FKC.PARENT_OBJECT_ID INNER JOIN SYS.COLUMNS COL ON COL.COLUMN_ID = PARENT_COLUMN_ID AND COL.OBJECT_ID = TB.OBJECT_ID INNER JOIN SYS.TABLES RTB ON RTB.OBJECT_ID = FKC.REFERENCED_OBJECT_ID INNER JOIN SYS.COLUMNS RCOL ON RCOL.COLUMN_ID = REFERENCED_COLUMN_ID AND RCOL.OBJECT_ID = RTB.OBJECT_ID WHERE TB.NAME ='myTable' AND COL.NAME ='myColumn' AND SCHEMA_NAME(TB.SCHEMA_ID) ='mySchema'"
expectation:"SELECT CONSTRAINT_NAME as constraint_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE (REFERENCED_TABLE_NAME = 'User' AND REFERENCED_COLUMN_NAME = 'email') OR (TABLE_NAME = 'User' AND COLUMN_NAME = 'email' AND REFERENCED_TABLE_NAME IS NOT NULL)"
expectation:"SELECT CONSTRAINT_NAME as constraint_name,CONSTRAINT_NAME as constraintName,CONSTRAINT_SCHEMA as constraintSchema,CONSTRAINT_SCHEMA as constraintCatalog,TABLE_NAME as tableName,TABLE_SCHEMA as tableSchema,TABLE_SCHEMA as tableCatalog,COLUMN_NAME as columnName,REFERENCED_TABLE_SCHEMA as referencedTableSchema,REFERENCED_TABLE_SCHEMA as referencedTableCatalog,REFERENCED_TABLE_NAME as referencedTableName,REFERENCED_COLUMN_NAME as referencedColumnName FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE (REFERENCED_TABLE_NAME = 'User' AND REFERENCED_COLUMN_NAME = 'email') OR (TABLE_NAME = 'User' AND COLUMN_NAME = 'email' AND REFERENCED_TABLE_NAME IS NOT NULL)"