diff --git a/public/app/plugins/datasource/postgres/meta_query.ts b/public/app/plugins/datasource/postgres/meta_query.ts index 66ff8867393..64271c022cc 100644 --- a/public/app/plugins/datasource/postgres/meta_query.ts +++ b/public/app/plugins/datasource/postgres/meta_query.ts @@ -10,7 +10,6 @@ export class PostgresMetaQuery { // query that returns first table found that has a timestamptz column and a float column let query = ` SELECT - table_schema, table_name, ( SELECT column_name @@ -32,7 +31,10 @@ SELECT ) AS value_column FROM information_schema.tables t WHERE - table_schema !~* '^_|^pg_|information_schema' AND + table_schema IN ( + SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END + FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) + ) AND EXISTS ( SELECT 1 FROM information_schema.columns c @@ -53,23 +55,30 @@ LIMIT 1 return query; } - buildSchemaQuery() { - let query = 'SELECT quote_ident(schema_name) FROM information_schema.schemata WHERE'; - query += " schema_name !~* '^pg_|^_|information_schema' ORDER BY schema_name"; - - return query; - } - buildTableQuery() { - let query = 'SELECT quote_ident(table_name) FROM information_schema.tables WHERE '; - query += 'table_schema = ' + this.quoteIdentAsLiteral(this.target.schema); - query += ' ORDER BY table_name'; + let query = ` +SELECT quote_ident(table_name) +FROM information_schema.tables +WHERE + table_schema IN ( + SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END + FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) + ) +ORDER BY table_name`; return query; } buildColumnQuery(type?: string) { - let query = 'SELECT quote_ident(column_name) FROM information_schema.columns WHERE '; - query += 'table_schema = ' + this.quoteIdentAsLiteral(this.target.schema); + let query = ` +SELECT quote_ident(column_name) +FROM information_schema.columns +WHERE + table_schema IN ( + SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END + FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) + LIMIT 1 + ) +`; query += ' AND table_name = ' + this.quoteIdentAsLiteral(this.target.table); switch (type) { @@ -100,15 +109,23 @@ LIMIT 1 buildValueQuery(column: string) { let query = 'SELECT DISTINCT quote_literal(' + column + ')'; - query += ' FROM ' + this.target.schema + '.' + this.target.table; + query += ' FROM ' + this.target.table; query += ' WHERE $__timeFilter(' + this.target.timeColumn + ')'; query += ' ORDER BY 1 LIMIT 100'; return query; } buildDatatypeQuery(column: string) { - let query = 'SELECT data_type FROM information_schema.columns WHERE '; - query += ' table_schema = ' + this.quoteIdentAsLiteral(this.target.schema); + let query = ` +SELECT data_type +FROM information_schema.columns +WHERE + table_schema IN ( + SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END + FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) + LIMIT 1 + ) +`; query += ' AND table_name = ' + this.quoteIdentAsLiteral(this.target.table); query += ' AND column_name = ' + this.quoteIdentAsLiteral(column); return query; diff --git a/public/app/plugins/datasource/postgres/partials/query.editor.html b/public/app/plugins/datasource/postgres/partials/query.editor.html index 90dbdf2eee0..68711f3ea0b 100644 --- a/public/app/plugins/datasource/postgres/partials/query.editor.html +++ b/public/app/plugins/datasource/postgres/partials/query.editor.html @@ -13,7 +13,6 @@
- diff --git a/public/app/plugins/datasource/postgres/postgres_query.ts b/public/app/plugins/datasource/postgres/postgres_query.ts index d0aa8a45841..3c1b1b681b4 100644 --- a/public/app/plugins/datasource/postgres/postgres_query.ts +++ b/public/app/plugins/datasource/postgres/postgres_query.ts @@ -11,7 +11,6 @@ export default class PostgresQuery { this.templateSrv = templateSrv; this.scopedVars = scopedVars; - target.schema = target.schema || 'public'; target.format = target.format || 'time_series'; target.timeColumn = target.timeColumn || 'time'; target.metricColumn = target.metricColumn || 'none'; @@ -147,13 +146,15 @@ export default class PostgresQuery { } if (special) { - let over = ''; + let overParts = []; if (this.hasMetricColumn()) { - over = 'PARTITION BY ' + this.target.metricColumn; + overParts.push('PARTITION BY ' + this.target.metricColumn); } if (!aggregate) { - over += ' ORDER BY ' + this.target.timeColumn; + overParts.push('ORDER BY ' + this.target.timeColumn); } + + let over = overParts.join(' '); switch (special.params[0]) { case 'increase': query = query + ' - lag(' + query + ') OVER (' + over + ')'; @@ -234,7 +235,7 @@ export default class PostgresQuery { } query += this.buildValueColumns(); - query += '\nFROM ' + this.target.schema + '.' + this.target.table; + query += '\nFROM ' + this.target.table; query += this.buildWhereClause(); query += this.buildGroupByClause(); diff --git a/public/app/plugins/datasource/postgres/query_ctrl.ts b/public/app/plugins/datasource/postgres/query_ctrl.ts index 68eac1cf34a..97db612e7db 100644 --- a/public/app/plugins/datasource/postgres/query_ctrl.ts +++ b/public/app/plugins/datasource/postgres/query_ctrl.ts @@ -28,7 +28,6 @@ export class PostgresQueryCtrl extends QueryCtrl { lastQueryMeta: QueryMeta; lastQueryError: string; showHelp: boolean; - schemaSegment: any; tableSegment: any; whereAdd: any; timeColumnSegment: any; @@ -59,8 +58,6 @@ export class PostgresQueryCtrl extends QueryCtrl { } } - this.schemaSegment = uiSegmentSrv.newSegment(this.target.schema); - if (!this.target.table) { this.tableSegment = uiSegmentSrv.newSegment({ value: 'select table', fake: true }); } else { @@ -119,18 +116,6 @@ export class PostgresQueryCtrl extends QueryCtrl { button.value = plusButton.value; } - getSchemaSegments() { - return this.datasource - .metricFindQuery(this.metaBuilder.buildSchemaQuery()) - .then(this.transformToSegments({})) - .catch(this.handleQueryError.bind(this)); - } - - schemaChanged() { - this.target.schema = this.schemaSegment.value; - this.panelCtrl.refresh(); - } - getTableSegments() { return this.datasource .metricFindQuery(this.metaBuilder.buildTableQuery()) diff --git a/public/app/plugins/datasource/postgres/specs/postgres_query.jest.ts b/public/app/plugins/datasource/postgres/specs/postgres_query.jest.ts index 659ca94496c..33d997d2d0a 100644 --- a/public/app/plugins/datasource/postgres/specs/postgres_query.jest.ts +++ b/public/app/plugins/datasource/postgres/specs/postgres_query.jest.ts @@ -66,6 +66,37 @@ describe('PostgresQuery', function() { expect(query.buildValueColumn(column)).toBe('v - lag(v) OVER (ORDER BY time) AS "a"'); }); + describe('When generating value column SQL with metric column', function() { + let query = new PostgresQuery({}, templateSrv); + query.target.metricColumn = 'host'; + + let column = [{ type: 'column', params: ['value'] }]; + expect(query.buildValueColumn(column)).toBe('value'); + column = [{ type: 'column', params: ['value'] }, { type: 'alias', params: ['alias'] }]; + expect(query.buildValueColumn(column)).toBe('value AS "alias"'); + column = [ + { type: 'column', params: ['v'] }, + { type: 'alias', params: ['a'] }, + { type: 'aggregate', params: ['max'] }, + ]; + expect(query.buildValueColumn(column)).toBe('max(v) AS "a"'); + column = [ + { type: 'column', params: ['v'] }, + { type: 'alias', params: ['a'] }, + { type: 'special', params: ['increase'] }, + ]; + expect(query.buildValueColumn(column)).toBe('v - lag(v) OVER (PARTITION BY host ORDER BY time) AS "a"'); + column = [ + { type: 'column', params: ['v'] }, + { type: 'alias', params: ['a'] }, + { type: 'aggregate', params: ['max'] }, + { type: 'special', params: ['increase'] }, + ]; + expect(query.buildValueColumn(column)).toBe( + 'max(v ORDER BY time) - lag(max(v ORDER BY time)) OVER (PARTITION BY host) AS "a"' + ); + }); + describe('When generating WHERE clause', function() { let query = new PostgresQuery({ where: [] }, templateSrv); @@ -95,18 +126,17 @@ describe('PostgresQuery', function() { describe('When generating complete statement', function() { let target = { timeColumn: 't', - schema: 'public', table: 'table', select: [[{ type: 'column', params: ['value'] }]], where: [], }; - let result = 'SELECT\n t AS "time",\n value\nFROM public.table\nORDER BY 1'; + let result = 'SELECT\n t AS "time",\n value\nFROM table\nORDER BY 1'; let query = new PostgresQuery(target, templateSrv); expect(query.buildQuery()).toBe(result); query.target.metricColumn = 'm'; - result = 'SELECT\n t AS "time",\n m AS metric,\n value\nFROM public.table\nORDER BY 1'; + result = 'SELECT\n t AS "time",\n m AS metric,\n value\nFROM table\nORDER BY 1'; expect(query.buildQuery()).toBe(result); }); });