diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index 804e64841..17271d52d 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -66,6 +66,7 @@ class Analyser extends DatabaseAnalyser { : 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'])); + const indexcols = await this.driver.query(this.pool, this.createQuery('indexcols', ['tables'])); return { tables: tables.rows.map(table => { @@ -110,7 +111,14 @@ class Analyser extends DatabaseAnalyser { .map(idx => ({ constraintName: idx.index_name, isUnique: idx.is_unique, - columns: idx.column_names.split('|').map(columnName => ({ columnName })), + columns: _.compact( + idx.indkey + .split(' ') + .map(colid => indexcols.rows.find(col => col.oid == idx.oid && col.attnum == colid)) + .map(col => ({ + columnName: col.column_name, + })) + ), })), }; }), diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js index 6877b3331..17f5e77e3 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js @@ -11,6 +11,7 @@ const routines = require('./routines'); const routineModifications = require('./routineModifications'); const matviewColumns = require('./matviewColumns'); const indexes = require('./indexes'); +const indexcols = require('./indexcols'); module.exports = { columns, @@ -26,4 +27,5 @@ module.exports = { matviewModifications, matviewColumns, indexes, + indexcols, }; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/indexcols.js b/plugins/dbgate-plugin-postgres/src/backend/sql/indexcols.js new file mode 100644 index 000000000..4acf4fbd2 --- /dev/null +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/indexcols.js @@ -0,0 +1,24 @@ +module.exports = ` + select + a.attname as "column_name", + a.attnum as "attnum", + a.attrelid as "oid" + from + pg_class t, + pg_class i, + pg_attribute a, + pg_index ix, + pg_namespace c + where + t.oid = ix.indrelid + and a.attnum = ANY(ix.indkey) + and a.attrelid = t.oid + and i.oid = ix.indexrelid + 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 + order by + t.relname +`; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js b/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js index 3dbff1352..06922b159 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/indexes.js @@ -5,12 +5,8 @@ module.exports = ` i.relname as "index_name", ix.indisprimary as "is_primary", ix.indisunique as "is_unique", - ( - select - array_to_string(array_agg((select a.attname from pg_attribute a where ord = a.attnum and a.attrelid = t.oid)), '|') - from - unnest(ix.indkey) ord - ) as "column_names" + ix.indkey as "indkey", + t.oid as "oid" from pg_class t, pg_class i,