diff --git a/public/app/plugins/datasource/postgres/meta_query.ts b/public/app/plugins/datasource/postgres/meta_query.ts index 0c54cc26cad..7339a3e3882 100644 --- a/public/app/plugins/datasource/postgres/meta_query.ts +++ b/public/app/plugins/datasource/postgres/meta_query.ts @@ -25,7 +25,7 @@ export class PostgresMetaQuery { findMetricTable() { // query that returns first table found that has a timestamp(tz) column and a float column - const query = ` + let query = ` SELECT quote_ident(table_name) as table_name, ( SELECT @@ -47,11 +47,9 @@ SELECT ORDER BY ordinal_position LIMIT 1 ) AS value_column FROM information_schema.tables t -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'),',')) - ) AND +WHERE `; + query += this.buildSchemaConstraint(); + query += ` AND EXISTS ( SELECT 1 FROM information_schema.columns c @@ -76,8 +74,14 @@ LIMIT 1 buildSchemaConstraint() { const query = ` table_schema IN ( - SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END - FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) + SELECT + CASE WHEN trim(s[i]) = '"$user"' THEN user ELSE trim(s[i]) END + FROM + generate_series( + array_lower(string_to_array(current_setting('search_path'),','),1), + array_upper(string_to_array(current_setting('search_path'),','),1) + ) as i, + string_to_array(current_setting('search_path'),',') s )`; return query; } @@ -92,11 +96,7 @@ table_schema IN ( query += ' AND table_name = ' + this.quoteIdentAsLiteral(parts[1]); return query; } else { - query = ` -table_schema IN ( - SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END - FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) -)`; + query = this.buildSchemaConstraint(); query += ' AND table_name = ' + this.quoteIdentAsLiteral(table); return query; @@ -149,18 +149,8 @@ table_schema IN ( } buildDatatypeQuery(column: string) { - let query = ` -SELECT udt_name -FROM information_schema.columns -WHERE - table_schema IN ( - SELECT schema FROM ( - SELECT CASE WHEN trim(unnest) = \'"$user"\' THEN user ELSE trim(unnest) END as schema - FROM unnest(string_to_array(current_setting(\'search_path\'),\',\')) - ) s - WHERE EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = s.schema) - ) -`; + let query = 'SELECT udt_name FROM information_schema.columns WHERE '; + query += this.buildSchemaConstraint(); query += ' AND table_name = ' + this.quoteIdentAsLiteral(this.target.table); query += ' AND column_name = ' + this.quoteIdentAsLiteral(column); return query;