diff --git a/integration-tests/__tests__/table-analyse.spec.js b/integration-tests/__tests__/table-analyse.spec.js index 3282122a9..a637fe2f2 100644 --- a/integration-tests/__tests__/table-analyse.spec.js +++ b/integration-tests/__tests__/table-analyse.spec.js @@ -2,7 +2,7 @@ const engines = require('../engines'); const { testWrapper } = require('../tools'); const t1Sql = 'CREATE TABLE t1 (id int not null primary key, val1 varchar(50) null)'; -const ix1Sql = 'CREATE index ix1 ON t1(val1)'; +const ix1Sql = 'CREATE index ix1 ON t1(val1, id)'; const t2Sql = 'CREATE TABLE t2 (id int not null primary key, val2 varchar(50) null)'; const txMatch = (tname, vcolname, nextcol) => @@ -120,8 +120,9 @@ describe('Table analyse', () => { const t1 = structure.tables.find(x => x.pureName == 't1'); expect(t1.indexes.length).toEqual(1); - expect(t1.indexes[0].columns.length).toEqual(1); + expect(t1.indexes[0].columns.length).toEqual(2); expect(t1.indexes[0].columns[0]).toEqual(expect.objectContaining({ columnName: 'val1' })); + expect(t1.indexes[0].columns[1]).toEqual(expect.objectContaining({ columnName: 'id' })); }) ); }); diff --git a/plugins/dbgate-plugin-mysql/src/backend/Analyser.js b/plugins/dbgate-plugin-mysql/src/backend/Analyser.js index 9989c7d23..026c8118e 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-mysql/src/backend/Analyser.js @@ -74,6 +74,7 @@ class Analyser extends DatabaseAnalyser { ); const viewTexts = await this.getViewTexts(views.rows.map(x => x.pureName)); + const indexes = await this.driver.query(this.pool, this.createQuery('indexes', ['tables'])); return { tables: tables.rows.map(table => ({ @@ -83,6 +84,19 @@ class Analyser extends DatabaseAnalyser { columns: columns.rows.filter(col => col.pureName == table.pureName).map(getColumnInfo), primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, pkColumns.rows), foreignKeys: DatabaseAnalyser.extractForeignKeys(table, fkColumns.rows), + uniques: [], + indexes: _.uniqBy( + indexes.rows.filter(idx => idx.tableName == table.pureName), + 'constraintName' + ).map(idx => ({ + ..._.pick(idx, ['constraintName', 'indexType']), + isUnique: !idx.nonUnique, + columns: indexes.rows + .filter(col => col.tableName == idx.tableName && col.constraintName == idx.constraintName) + .map(col => ({ + ..._.pick(col, ['columnName']), + })), + })), })), views: views.rows.map(view => ({ ...view, diff --git a/plugins/dbgate-plugin-mysql/src/backend/sql/index.js b/plugins/dbgate-plugin-mysql/src/backend/sql/index.js index f5a4992ec..3a514ee7b 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-mysql/src/backend/sql/index.js @@ -4,6 +4,7 @@ const primaryKeys = require('./primaryKeys'); const foreignKeys = require('./foreignKeys'); const tableModifications = require('./tableModifications'); const views = require('./views'); +const indexes = require('./indexes'); const programmables = require('./programmables'); const procedureModifications = require('./procedureModifications'); const functionModifications = require('./functionModifications'); @@ -18,4 +19,5 @@ module.exports = { programmables, procedureModifications, functionModifications, + indexes, }; diff --git a/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js b/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js new file mode 100644 index 000000000..492a205ee --- /dev/null +++ b/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js @@ -0,0 +1,11 @@ +module.exports = ` + SELECT + INDEX_NAME AS constraintName, + TABLE_NAME AS tableName, + COLUMN_NAME AS columnName, + INDEX_TYPE AS indexType, + NON_UNIQUE AS nonUnique + FROM INFORMATION_SCHEMA.STATISTICS + WHERE TABLE_SCHEMA = '#DATABASE#' AND TABLE_NAME =OBJECT_ID_CONDITION AND INDEX_NAME != 'PRIMARY' AND INDEX_NAME NOT LIKE 'IFK_%' + ORDER BY SEQ_IN_INDEX +`;