Przeglądaj źródła

Merge pull request #13342 from svenklemm/unnest

Don't use unnest in queries for redshift compatibility
Marcus Efraimsson 7 lat temu
rodzic
commit
28ff8a6716
1 zmienionych plików z 15 dodań i 25 usunięć
  1. 15 25
      public/app/plugins/datasource/postgres/meta_query.ts

+ 15 - 25
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;