From 820044b4890805051204eb782bed7609dce6033e Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Fri, 20 Aug 2021 22:17:02 +0200 Subject: [PATCH] postgre sql indexes analysis - partialy working --- .../src/backend/sql/indexes.js | 2 +- .../src/backend/Analyser.js | 8 +++++ .../src/backend/sql/index.js | 2 ++ .../src/backend/sql/indexes.js | 35 +++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js diff --git a/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js b/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js index 492a205e..caaea2cb 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js +++ b/plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js @@ -6,6 +6,6 @@ module.exports = ` 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_%' + WHERE TABLE_SCHEMA = '#DATABASE#' AND TABLE_NAME =OBJECT_ID_CONDITION AND INDEX_NAME != 'PRIMARY' ORDER BY SEQ_IN_INDEX `; diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index 7ff13b89..804e6484 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -65,6 +65,7 @@ class Analyser extends DatabaseAnalyser { ? await this.driver.query(this.pool, this.createQuery('matviewColumns', ['matviews'])) : null; const routines = await this.driver.query(this.pool, this.createQuery('routines', ['procedures', 'functions'])); + const indexes = await this.driver.query(this.pool, this.createQuery('indexes', ['tables'])); return { tables: tables.rows.map(table => { @@ -104,6 +105,13 @@ class Analyser extends DatabaseAnalyser { refSchemaName: x.ref_schema_name, })) ), + indexes: indexes.rows + .filter(x => x.table_name == table.pure_name && x.schema_name == table.schema_name) + .map(idx => ({ + constraintName: idx.index_name, + isUnique: idx.is_unique, + columns: idx.column_names.split('|').map(columnName => ({ columnName })), + })), }; }), views: views.rows.map(view => ({ diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js index 98b86525..6877b333 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js @@ -10,6 +10,7 @@ const matviews = require('./matviews'); const routines = require('./routines'); const routineModifications = require('./routineModifications'); const matviewColumns = require('./matviewColumns'); +const indexes = require('./indexes'); module.exports = { columns, @@ -24,4 +25,5 @@ module.exports = { matviews, matviewModifications, matviewColumns, + indexes, }; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js b/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js new file mode 100644 index 00000000..3304cbce --- /dev/null +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js @@ -0,0 +1,35 @@ +module.exports = ` + select + t.relname as "table_name", + c.nspname as "schema_name", + i.relname as "index_name", + ix.indisprimary as "is_primary", + ix.indisunique as "is_unique", + array_to_string(array_agg(a.attname), '|') as "column_names" + from + pg_class t, + pg_class i, + pg_index ix, + pg_attribute a, + pg_namespace c + where + t.oid = ix.indrelid + and i.oid = ix.indexrelid + and a.attrelid = t.oid + and a.attnum = ANY(ix.indkey) + and t.relkind = 'r' + and ix.indisprimary = false + and t.relnamespace = c.oid + and c.nspname != 'pg_catalog' + and ('tables:' || c.nspname || '.' || t.relname) =OBJECT_ID_CONDITION + group by + i.oid, + t.relname, + i.relname, + c.nspname, + ix.indisprimary, + ix.indisunique + order by + t.relname, + i.relname +`;