1{"version":3,"file":"postgresPlugin.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/components/sql_part/sql_part.ts","webpack://grafana/./public/app/features/datasources/utils/passwordHandlers.ts","webpack://grafana/./public/app/plugins/datasource/postgres/response_parser.ts","webpack://grafana/./public/app/plugins/datasource/postgres/postgres_query_model.ts","webpack://grafana/./public/app/plugins/datasource/postgres/datasource.ts","webpack://grafana/./public/app/plugins/datasource/postgres/meta_query.ts","webpack://grafana/./public/app/plugins/datasource/postgres/sql_part.ts","webpack://grafana/./public/app/plugins/datasource/postgres/query_ctrl.ts","webpack://grafana/./public/app/plugins/datasource/postgres/config_ctrl.ts","webpack://grafana/./public/app/plugins/datasource/postgres/module.ts"],"sourcesContent":["import { clone } from 'lodash';\n\nexport class SqlPartDef {\n  type: string;\n  style: string;\n  label: string;\n  params: any[];\n  defaultParams: any[];\n  wrapOpen: string;\n  wrapClose: string;\n  separator: string;\n\n  constructor(options: any) {\n    this.type = options.type;\n    if (options.label) {\n      this.label = options.label;\n    } else {\n      this.label = this.type[0].toUpperCase() + this.type.substring(1) + ':';\n    }\n    this.style = options.style;\n    if (this.style === 'function') {\n      this.wrapOpen = '(';\n      this.wrapClose = ')';\n      this.separator = ', ';\n    } else {\n      this.wrapOpen = ' ';\n      this.wrapClose = ' ';\n      this.separator = ' ';\n    }\n    this.params = options.params;\n    this.defaultParams = options.defaultParams;\n  }\n}\n\nexport class SqlPart {\n  part: any;\n  def: SqlPartDef;\n  params: any[];\n  label: string;\n  name: string;\n  datatype: string;\n\n  constructor(part: any, def: any) {\n    this.part = part;\n    this.def = def;\n    if (!this.def) {\n      throw { message: 'Could not find sql part ' + part.type };\n    }\n\n    this.datatype = part.datatype;\n\n    if (part.name) {\n      this.name = part.name;\n      this.label = def.label + ' ' + part.name;\n    } else {\n      this.name = '';\n      this.label = def.label;\n    }\n\n    part.params = part.params || clone(this.def.defaultParams);\n    this.params = part.params;\n  }\n\n  updateParam(strValue: string, index: number) {\n    // handle optional parameters\n    if (strValue === '' && this.def.params[index].optional) {\n      this.params.splice(index, 1);\n    } else {\n      this.params[index] = strValue;\n    }\n\n    this.part.params = this.params;\n  }\n}\n","/**\n * Set of handlers for secure password field in Angular components. They handle backward compatibility with\n * passwords stored in plain text fields.\n */\n\nimport { SyntheticEvent } from 'react';\n\nexport enum PasswordFieldEnum {\n  Password = 'password',\n  BasicAuthPassword = 'basicAuthPassword',\n}\n\n/**\n * Basic shape for settings controllers in at the moment mostly angular data source plugins.\n */\nexport type Ctrl = {\n  current: {\n    secureJsonFields: {\n      [key: string]: boolean;\n    };\n    secureJsonData?: {\n      [key: string]: string;\n    };\n    password?: string;\n    basicAuthPassword?: string;\n  };\n};\n\nexport const createResetHandler = (ctrl: Ctrl, field: PasswordFieldEnum) => (\n  event: SyntheticEvent<HTMLInputElement>\n) => {\n  event.preventDefault();\n  // Reset also normal plain text password to remove it and only save it in secureJsonData.\n  ctrl.current[field] = undefined;\n  ctrl.current.secureJsonFields[field] = false;\n  ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n  ctrl.current.secureJsonData[field] = '';\n};\n\nexport const createChangeHandler = (ctrl: any, field: PasswordFieldEnum) => (\n  event: SyntheticEvent<HTMLInputElement>\n) => {\n  ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n  ctrl.current.secureJsonData[field] = event.currentTarget.value;\n};\n","import { AnnotationEvent, DataFrame, MetricFindValue } from '@grafana/data';\nimport { BackendDataSourceResponse, FetchResponse, toDataQueryResponse } from '@grafana/runtime';\n\nexport default class ResponseParser {\n  transformMetricFindResponse(raw: FetchResponse<BackendDataSourceResponse>): MetricFindValue[] {\n    const frames = toDataQueryResponse(raw).data as DataFrame[];\n\n    if (!frames || !frames.length) {\n      return [];\n    }\n\n    const frame = frames[0];\n\n    const values: MetricFindValue[] = [];\n    const textField = frame.fields.find((f) => f.name === '__text');\n    const valueField = frame.fields.find((f) => f.name === '__value');\n\n    if (textField && valueField) {\n      for (let i = 0; i < textField.values.length; i++) {\n        values.push({ text: '' + textField.values.get(i), value: '' + valueField.values.get(i) });\n      }\n    } else {\n      values.push(\n        ...frame.fields\n          .flatMap((f) => f.values.toArray())\n          .map((v) => ({\n            text: v,\n          }))\n      );\n    }\n\n    return Array.from(new Set(values.map((v) => v.text))).map((text) => ({\n      text,\n      value: values.find((v) => v.text === text)?.value,\n    }));\n  }\n\n  async transformAnnotationResponse(options: any, data: BackendDataSourceResponse): Promise<AnnotationEvent[]> {\n    const frames = toDataQueryResponse({ data: data }).data as DataFrame[];\n    if (!frames || !frames.length) {\n      return [];\n    }\n    const frame = frames[0];\n    const timeField = frame.fields.find((f) => f.name === 'time');\n\n    if (!timeField) {\n      throw new Error('Missing mandatory time column (with time column alias) in annotation query');\n    }\n\n    const timeEndField = frame.fields.find((f) => f.name === 'timeend');\n    const textField = frame.fields.find((f) => f.name === 'text');\n    const tagsField = frame.fields.find((f) => f.name === 'tags');\n\n    const list: AnnotationEvent[] = [];\n    for (let i = 0; i < frame.length; i++) {\n      const timeEnd = timeEndField && timeEndField.values.get(i) ? Math.floor(timeEndField.values.get(i)) : undefined;\n      list.push({\n        annotation: options.annotation,\n        time: Math.floor(timeField.values.get(i)),\n        timeEnd,\n        text: textField && textField.values.get(i) ? textField.values.get(i) : '',\n        tags:\n          tagsField && tagsField.values.get(i)\n            ? tagsField.values\n                .get(i)\n                .trim()\n                .split(/\\s*,\\s*/)\n            : [],\n      });\n    }\n\n    return list;\n  }\n}\n","import { find, map } from 'lodash';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { ScopedVars } from '@grafana/data';\n\nexport default class PostgresQueryModel {\n  target: any;\n  templateSrv: any;\n  scopedVars: any;\n\n  /** @ngInject */\n  constructor(target: any, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n    this.target = target;\n    this.templateSrv = templateSrv;\n    this.scopedVars = scopedVars;\n\n    target.format = target.format || 'time_series';\n    target.timeColumn = target.timeColumn || 'time';\n    target.metricColumn = target.metricColumn || 'none';\n\n    target.group = target.group || [];\n    target.where = target.where || [{ type: 'macro', name: '$__timeFilter', params: [] }];\n    target.select = target.select || [[{ type: 'column', params: ['value'] }]];\n\n    // handle pre query gui panels gracefully\n    if (!('rawQuery' in this.target)) {\n      if ('rawSql' in target) {\n        // pre query gui panel\n        target.rawQuery = true;\n      } else {\n        // new panel\n        target.rawQuery = false;\n      }\n    }\n\n    // give interpolateQueryStr access to this\n    this.interpolateQueryStr = this.interpolateQueryStr.bind(this);\n  }\n\n  // remove identifier quoting from identifier to use in metadata queries\n  unquoteIdentifier(value: string) {\n    if (value[0] === '\"' && value[value.length - 1] === '\"') {\n      return value.substring(1, value.length - 1).replace(/\"\"/g, '\"');\n    } else {\n      return value;\n    }\n  }\n\n  quoteIdentifier(value: any) {\n    return '\"' + String(value).replace(/\"/g, '\"\"') + '\"';\n  }\n\n  quoteLiteral(value: any) {\n    return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n  }\n\n  escapeLiteral(value: any) {\n    return String(value).replace(/'/g, \"''\");\n  }\n\n  hasTimeGroup() {\n    return find(this.target.group, (g: any) => g.type === 'time');\n  }\n\n  hasMetricColumn() {\n    return this.target.metricColumn !== 'none';\n  }\n\n  interpolateQueryStr(value: any, variable: { multi: any; includeAll: any }, defaultFormatFn: any) {\n    // if no multi or include all do not regexEscape\n    if (!variable.multi && !variable.includeAll) {\n      return this.escapeLiteral(value);\n    }\n\n    if (typeof value === 'string') {\n      return this.quoteLiteral(value);\n    }\n\n    const escapedValues = map(value, this.quoteLiteral);\n    return escapedValues.join(',');\n  }\n\n  render(interpolate?: any) {\n    const target = this.target;\n\n    // new query with no table set yet\n    if (!this.target.rawQuery && !('table' in this.target)) {\n      return '';\n    }\n\n    if (!target.rawQuery) {\n      target.rawSql = this.buildQuery();\n    }\n\n    if (interpolate) {\n      return this.templateSrv.replace(target.rawSql, this.scopedVars, this.interpolateQueryStr);\n    } else {\n      return target.rawSql;\n    }\n  }\n\n  hasUnixEpochTimecolumn() {\n    return ['int4', 'int8', 'float4', 'float8', 'numeric'].indexOf(this.target.timeColumnType) > -1;\n  }\n\n  buildTimeColumn(alias = true) {\n    const timeGroup = this.hasTimeGroup();\n    let query;\n    let macro = '$__timeGroup';\n\n    if (timeGroup) {\n      let args;\n      if (timeGroup.params.length > 1 && timeGroup.params[1] !== 'none') {\n        args = timeGroup.params.join(',');\n      } else {\n        args = timeGroup.params[0];\n      }\n      if (this.hasUnixEpochTimecolumn()) {\n        macro = '$__unixEpochGroup';\n      }\n      if (alias) {\n        macro += 'Alias';\n      }\n      query = macro + '(' + this.target.timeColumn + ',' + args + ')';\n    } else {\n      query = this.target.timeColumn;\n      if (alias) {\n        query += ' AS \"time\"';\n      }\n    }\n\n    return query;\n  }\n\n  buildMetricColumn() {\n    if (this.hasMetricColumn()) {\n      return this.target.metricColumn + ' AS metric';\n    }\n\n    return '';\n  }\n\n  buildValueColumns() {\n    let query = '';\n    for (const column of this.target.select) {\n      query += ',\\n  ' + this.buildValueColumn(column);\n    }\n\n    return query;\n  }\n\n  buildValueColumn(column: any) {\n    let query = '';\n\n    const columnName: any = find(column, (g: any) => g.type === 'column');\n    query = columnName.params[0];\n\n    const aggregate: any = find(column, (g: any) => g.type === 'aggregate' || g.type === 'percentile');\n    const windows: any = find(column, (g: any) => g.type === 'window' || g.type === 'moving_window');\n\n    if (aggregate) {\n      const func = aggregate.params[0];\n      switch (aggregate.type) {\n        case 'aggregate':\n          if (func === 'first' || func === 'last') {\n            query = func + '(' + query + ',' + this.target.timeColumn + ')';\n          } else {\n            query = func + '(' + query + ')';\n          }\n          break;\n        case 'percentile':\n          query = func + '(' + aggregate.params[1] + ') WITHIN GROUP (ORDER BY ' + query + ')';\n          break;\n      }\n    }\n\n    if (windows) {\n      const overParts = [];\n      if (this.hasMetricColumn()) {\n        overParts.push('PARTITION BY ' + this.target.metricColumn);\n      }\n      overParts.push('ORDER BY ' + this.buildTimeColumn(false));\n\n      const over = overParts.join(' ');\n      let curr: string;\n      let prev: string;\n      switch (windows.type) {\n        case 'window':\n          switch (windows.params[0]) {\n            case 'delta':\n              curr = query;\n              prev = 'lag(' + curr + ') OVER (' + over + ')';\n              query = curr + ' - ' + prev;\n              break;\n            case 'increase':\n              curr = query;\n              prev = 'lag(' + curr + ') OVER (' + over + ')';\n              query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev;\n              query += ' WHEN ' + prev + ' IS NULL THEN NULL ELSE ' + curr + ' END)';\n              break;\n            case 'rate':\n              let timeColumn = this.target.timeColumn;\n              if (aggregate) {\n                timeColumn = 'min(' + timeColumn + ')';\n              }\n\n              curr = query;\n              prev = 'lag(' + curr + ') OVER (' + over + ')';\n              query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev;\n              query += ' WHEN ' + prev + ' IS NULL THEN NULL ELSE ' + curr + ' END)';\n              query += '/extract(epoch from ' + timeColumn + ' - lag(' + timeColumn + ') OVER (' + over + '))';\n              break;\n            default:\n              query = windows.params[0] + '(' + query + ') OVER (' + over + ')';\n              break;\n          }\n          break;\n        case 'moving_window':\n          query = windows.params[0] + '(' + query + ') OVER (' + over + ' ROWS ' + windows.params[1] + ' PRECEDING)';\n          break;\n      }\n    }\n\n    const alias: any = find(column, (g: any) => g.type === 'alias');\n    if (alias) {\n      query += ' AS ' + this.quoteIdentifier(alias.params[0]);\n    }\n\n    return query;\n  }\n\n  buildWhereClause() {\n    let query = '';\n    const conditions = map(this.target.where, (tag, index) => {\n      switch (tag.type) {\n        case 'macro':\n          return tag.name + '(' + this.target.timeColumn + ')';\n          break;\n        case 'expression':\n          return tag.params.join(' ');\n          break;\n      }\n    });\n\n    if (conditions.length > 0) {\n      query = '\\nWHERE\\n  ' + conditions.join(' AND\\n  ');\n    }\n\n    return query;\n  }\n\n  buildGroupClause() {\n    let query = '';\n    let groupSection = '';\n\n    for (let i = 0; i < this.target.group.length; i++) {\n      const part = this.target.group[i];\n      if (i > 0) {\n        groupSection += ', ';\n      }\n      if (part.type === 'time') {\n        groupSection += '1';\n      } else {\n        groupSection += part.params[0];\n      }\n    }\n\n    if (groupSection.length) {\n      query = '\\nGROUP BY ' + groupSection;\n      if (this.hasMetricColumn()) {\n        query += ',2';\n      }\n    }\n    return query;\n  }\n\n  buildQuery() {\n    let query = 'SELECT';\n\n    query += '\\n  ' + this.buildTimeColumn();\n    if (this.hasMetricColumn()) {\n      query += ',\\n  ' + this.buildMetricColumn();\n    }\n    query += this.buildValueColumns();\n\n    query += '\\nFROM ' + this.target.table;\n\n    query += this.buildWhereClause();\n    query += this.buildGroupClause();\n\n    query += '\\nORDER BY 1';\n    if (this.hasMetricColumn()) {\n      query += ',2';\n    }\n\n    return query;\n  }\n}\n","import { map as _map } from 'lodash';\nimport { lastValueFrom, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { BackendDataSourceResponse, DataSourceWithBackend, FetchResponse, getBackendSrv } from '@grafana/runtime';\nimport { AnnotationEvent, DataSourceInstanceSettings, MetricFindValue, ScopedVars } from '@grafana/data';\n\nimport ResponseParser from './response_parser';\nimport PostgresQueryModel from 'app/plugins/datasource/postgres/postgres_query_model';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\n//Types\nimport { PostgresOptions, PostgresQuery, PostgresQueryForInterpolation } from './types';\nimport { getSearchFilterScopedVar } from '../../../features/variables/utils';\nimport { toTestingStatus } from '@grafana/runtime/src/utils/queryResponse';\n\nexport class PostgresDatasource extends DataSourceWithBackend<PostgresQuery, PostgresOptions> {\n  id: any;\n  name: any;\n  jsonData: any;\n  responseParser: ResponseParser;\n  queryModel: PostgresQueryModel;\n  interval: string;\n\n  constructor(\n    instanceSettings: DataSourceInstanceSettings<PostgresOptions>,\n    private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n    private readonly timeSrv: TimeSrv = getTimeSrv()\n  ) {\n    super(instanceSettings);\n    this.name = instanceSettings.name;\n    this.id = instanceSettings.id;\n    this.jsonData = instanceSettings.jsonData;\n    this.responseParser = new ResponseParser();\n    this.queryModel = new PostgresQueryModel({});\n    const settingsData = instanceSettings.jsonData || ({} as PostgresOptions);\n    this.interval = settingsData.timeInterval || '1m';\n  }\n\n  interpolateVariable = (value: string | string[], variable: { multi: any; includeAll: any }) => {\n    if (typeof value === 'string') {\n      if (variable.multi || variable.includeAll) {\n        return this.queryModel.quoteLiteral(value);\n      } else {\n        return value;\n      }\n    }\n\n    if (typeof value === 'number') {\n      return value;\n    }\n\n    const quotedValues = _map(value, (v) => {\n      return this.queryModel.quoteLiteral(v);\n    });\n    return quotedValues.join(',');\n  };\n\n  interpolateVariablesInQueries(\n    queries: PostgresQueryForInterpolation[],\n    scopedVars: ScopedVars\n  ): PostgresQueryForInterpolation[] {\n    let expandedQueries = queries;\n    if (queries && queries.length > 0) {\n      expandedQueries = queries.map((query) => {\n        const expandedQuery = {\n          ...query,\n          datasource: this.getRef(),\n          rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable),\n          rawQuery: true,\n        };\n        return expandedQuery;\n      });\n    }\n    return expandedQueries;\n  }\n\n  filterQuery(query: PostgresQuery): boolean {\n    return !query.hide;\n  }\n\n  applyTemplateVariables(target: PostgresQuery, scopedVars: ScopedVars): Record<string, any> {\n    const queryModel = new PostgresQueryModel(target, this.templateSrv, scopedVars);\n    return {\n      refId: target.refId,\n      datasource: this.getRef(),\n      rawSql: queryModel.render(this.interpolateVariable as any),\n      format: target.format,\n    };\n  }\n\n  async annotationQuery(options: any): Promise<AnnotationEvent[]> {\n    if (!options.annotation.rawQuery) {\n      return Promise.reject({\n        message: 'Query missing in annotation definition',\n      });\n    }\n\n    const query = {\n      refId: options.annotation.name,\n      datasource: this.getRef(),\n      rawSql: this.templateSrv.replace(options.annotation.rawQuery, options.scopedVars, this.interpolateVariable),\n      format: 'table',\n    };\n\n    return lastValueFrom(\n      getBackendSrv()\n        .fetch<BackendDataSourceResponse>({\n          url: '/api/ds/query',\n          method: 'POST',\n          data: {\n            from: options.range.from.valueOf().toString(),\n            to: options.range.to.valueOf().toString(),\n            queries: [query],\n          },\n          requestId: options.annotation.name,\n        })\n        .pipe(\n          map(\n            async (res: FetchResponse<BackendDataSourceResponse>) =>\n              await this.responseParser.transformAnnotationResponse(options, res.data)\n          )\n        )\n    );\n  }\n\n  metricFindQuery(query: string, optionalOptions: any): Promise<MetricFindValue[]> {\n    let refId = 'tempvar';\n    if (optionalOptions && optionalOptions.variable && optionalOptions.variable.name) {\n      refId = optionalOptions.variable.name;\n    }\n\n    const rawSql = this.templateSrv.replace(\n      query,\n      getSearchFilterScopedVar({ query, wildcardChar: '%', options: optionalOptions }),\n      this.interpolateVariable\n    );\n\n    const interpolatedQuery = {\n      refId: refId,\n      datasource: this.getRef(),\n      rawSql,\n      format: 'table',\n    };\n\n    const range = this.timeSrv.timeRange();\n\n    return lastValueFrom(\n      getBackendSrv()\n        .fetch<BackendDataSourceResponse>({\n          url: '/api/ds/query',\n          method: 'POST',\n          data: {\n            from: range.from.valueOf().toString(),\n            to: range.to.valueOf().toString(),\n            queries: [interpolatedQuery],\n          },\n          requestId: refId,\n        })\n        .pipe(\n          map((rsp) => {\n            return this.responseParser.transformMetricFindResponse(rsp);\n          }),\n          catchError((err) => {\n            return of([]);\n          })\n        )\n    );\n  }\n\n  private _metaRequest(rawSql: string) {\n    const refId = 'meta';\n    const range = this.timeSrv.timeRange();\n    const query = {\n      refId: refId,\n      datasource: this.getRef(),\n      rawSql,\n      format: 'table',\n    };\n    return getBackendSrv().fetch<BackendDataSourceResponse>({\n      url: '/api/ds/query',\n      method: 'POST',\n      data: {\n        from: range.from.valueOf().toString(),\n        to: range.to.valueOf().toString(),\n        queries: [query],\n      },\n      requestId: refId,\n    });\n  }\n\n  getVersion(): Promise<any> {\n    return lastValueFrom(this._metaRequest(\"SELECT current_setting('server_version_num')::int/100\"));\n  }\n\n  getTimescaleDBVersion(): Promise<any> {\n    return lastValueFrom(this._metaRequest(\"SELECT extversion FROM pg_extension WHERE extname = 'timescaledb'\"));\n  }\n\n  testDatasource(): Promise<any> {\n    return lastValueFrom(this._metaRequest('SELECT 1'))\n      .then(() => {\n        return { status: 'success', message: 'Database Connection OK' };\n      })\n      .catch((err: any) => {\n        return toTestingStatus(err);\n      });\n  }\n\n  targetContainsTemplate(target: any) {\n    let rawSql = '';\n\n    if (target.rawQuery) {\n      rawSql = target.rawSql;\n    } else {\n      const query = new PostgresQueryModel(target);\n      rawSql = query.buildQuery();\n    }\n\n    rawSql = rawSql.replace('$__', '');\n\n    return this.templateSrv.variableExists(rawSql);\n  }\n}\n","import QueryModel from './postgres_query_model';\n\nexport class PostgresMetaQuery {\n  constructor(private target: { table: string; timeColumn: string }, private queryModel: QueryModel) {}\n\n  getOperators(datatype: string) {\n    switch (datatype) {\n      case 'float4':\n      case 'float8': {\n        return ['=', '!=', '<', '<=', '>', '>='];\n      }\n      case 'text':\n      case 'varchar':\n      case 'char': {\n        return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', '~', '~*', '!~', '!~*'];\n      }\n      default: {\n        return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN'];\n      }\n    }\n  }\n\n  // quote identifier as literal to use in metadata queries\n  quoteIdentAsLiteral(value: string) {\n    return this.queryModel.quoteLiteral(this.queryModel.unquoteIdentifier(value));\n  }\n\n  findMetricTable() {\n    // query that returns first table found that has a timestamp(tz) column and a float column\n    let query = `\nSELECT\n\tquote_ident(table_name) as table_name,\n\t( SELECT\n\t    quote_ident(column_name) as column_name\n\t  FROM information_schema.columns c\n    WHERE\n      c.table_schema = t.table_schema AND\n      c.table_name = t.table_name AND\n      udt_name IN ('timestamptz','timestamp')\n    ORDER BY ordinal_position LIMIT 1\n  ) AS time_column,\n  ( SELECT\n      quote_ident(column_name) AS column_name\n    FROM information_schema.columns c\n    WHERE\n      c.table_schema = t.table_schema AND\n      c.table_name = t.table_name AND\n      udt_name='float8'\n    ORDER BY ordinal_position LIMIT 1\n  ) AS value_column\nFROM information_schema.tables t\nWHERE `;\n    query += this.buildSchemaConstraint();\n    query += ` AND\n  EXISTS\n  ( SELECT 1\n    FROM information_schema.columns c\n    WHERE\n      c.table_schema = t.table_schema AND\n      c.table_name = t.table_name AND\n      udt_name IN ('timestamptz','timestamp')\n  ) AND\n  EXISTS\n  ( SELECT 1\n    FROM information_schema.columns c\n    WHERE\n      c.table_schema = t.table_schema AND\n      c.table_name = t.table_name AND\n      udt_name='float8'\n  )\nLIMIT 1\n;`;\n    return query;\n  }\n\n  buildSchemaConstraint() {\n    const query = `\ntable_schema IN (\n  SELECT\n    CASE WHEN trim(s[i]) = '\"$user\"' THEN user ELSE trim(s[i]) END\n  FROM\n    generate_series(\n      array_lower(string_to_array(current_setting('search_path'),','),1),\n      array_upper(string_to_array(current_setting('search_path'),','),1)\n    ) as i,\n    string_to_array(current_setting('search_path'),',') s\n)`;\n    return query;\n  }\n\n  buildTableConstraint(table: string) {\n    let query = '';\n\n    // check for schema qualified table\n    if (table.includes('.')) {\n      const parts = table.split('.');\n      query = 'table_schema = ' + this.quoteIdentAsLiteral(parts[0]);\n      query += ' AND table_name = ' + this.quoteIdentAsLiteral(parts[1]);\n      return query;\n    } else {\n      query = this.buildSchemaConstraint();\n      query += ' AND table_name = ' + this.quoteIdentAsLiteral(table);\n\n      return query;\n    }\n  }\n\n  buildTableQuery() {\n    let query = 'SELECT quote_ident(table_name) FROM information_schema.tables WHERE ';\n    query += this.buildSchemaConstraint();\n    query += ' ORDER BY table_name';\n    return query;\n  }\n\n  buildColumnQuery(type?: string) {\n    let query = 'SELECT quote_ident(column_name) FROM information_schema.columns WHERE ';\n    query += this.buildTableConstraint(this.target.table);\n\n    switch (type) {\n      case 'time': {\n        query +=\n          \" AND data_type IN ('timestamp without time zone','timestamp with time zone','bigint','integer','double precision','real')\";\n        break;\n      }\n      case 'metric': {\n        query += \" AND data_type IN ('text','character','character varying')\";\n        break;\n      }\n      case 'value': {\n        query += \" AND data_type IN ('bigint','integer','double precision','real')\";\n        query += ' AND column_name <> ' + this.quoteIdentAsLiteral(this.target.timeColumn);\n        break;\n      }\n      case 'group': {\n        query += \" AND data_type IN ('text','character','character varying','uuid')\";\n        break;\n      }\n    }\n\n    query += ' ORDER BY column_name';\n\n    return query;\n  }\n\n  buildValueQuery(column: string) {\n    let query = 'SELECT DISTINCT quote_literal(' + column + ')';\n    query += ' FROM ' + this.target.table;\n    query += ' WHERE $__timeFilter(' + this.target.timeColumn + ')';\n    query += ' AND ' + column + ' IS NOT NULL';\n    query += ' ORDER BY 1 LIMIT 100';\n    return query;\n  }\n\n  buildDatatypeQuery(column: string) {\n    let query = 'SELECT udt_name FROM information_schema.columns WHERE ';\n    query += this.buildTableConstraint(this.target.table);\n    query += ' AND column_name = ' + this.quoteIdentAsLiteral(column);\n    return query;\n  }\n\n  buildAggregateQuery() {\n    let query = 'SELECT DISTINCT proname FROM pg_aggregate ';\n    query += 'INNER JOIN pg_proc ON pg_aggregate.aggfnoid = pg_proc.oid ';\n    query += 'INNER JOIN pg_type ON pg_type.oid=pg_proc.prorettype ';\n    query += \"WHERE pronargs=1 AND typname IN ('float8') AND aggkind='n' ORDER BY 1\";\n    return query;\n  }\n}\n","import { SqlPartDef, SqlPart } from 'app/angular/components/sql_part/sql_part';\n\nconst index: any[] = [];\n\nfunction createPart(part: any): any {\n  const def = index[part.type];\n  if (!def) {\n    return null;\n  }\n\n  return new SqlPart(part, def);\n}\n\nfunction register(options: any) {\n  index[options.type] = new SqlPartDef(options);\n}\n\nregister({\n  type: 'column',\n  style: 'label',\n  params: [{ type: 'column', dynamicLookup: true }],\n  defaultParams: ['value'],\n});\n\nregister({\n  type: 'expression',\n  style: 'expression',\n  label: 'Expr:',\n  params: [\n    { name: 'left', type: 'string', dynamicLookup: true },\n    { name: 'op', type: 'string', dynamicLookup: true },\n    { name: 'right', type: 'string', dynamicLookup: true },\n  ],\n  defaultParams: ['value', '=', 'value'],\n});\n\nregister({\n  type: 'macro',\n  style: 'label',\n  label: 'Macro:',\n  params: [],\n  defaultParams: [],\n});\n\nregister({\n  type: 'aggregate',\n  style: 'label',\n  params: [\n    {\n      name: 'name',\n      type: 'string',\n      options: ['avg', 'count', 'min', 'max', 'sum', 'stddev', 'variance'],\n    },\n  ],\n  defaultParams: ['avg'],\n});\n\nregister({\n  type: 'percentile',\n  label: 'Aggregate:',\n  style: 'label',\n  params: [\n    {\n      name: 'name',\n      type: 'string',\n      options: ['percentile_cont', 'percentile_disc'],\n    },\n    {\n      name: 'fraction',\n      type: 'number',\n      options: ['0.5', '0.75', '0.9', '0.95', '0.99'],\n    },\n  ],\n  defaultParams: ['percentile_cont', '0.95'],\n});\n\nregister({\n  type: 'alias',\n  style: 'label',\n  params: [{ name: 'name', type: 'string', quote: 'double' }],\n  defaultParams: ['alias'],\n});\n\nregister({\n  type: 'time',\n  style: 'function',\n  label: 'time',\n  params: [\n    {\n      name: 'interval',\n      type: 'interval',\n      options: ['$__interval', '1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n    },\n    {\n      name: 'fill',\n      type: 'string',\n      options: ['none', 'NULL', 'previous', '0'],\n    },\n  ],\n  defaultParams: ['$__interval', 'none'],\n});\n\nregister({\n  type: 'window',\n  style: 'label',\n  params: [\n    {\n      name: 'function',\n      type: 'string',\n      options: ['delta', 'increase', 'rate', 'sum'],\n    },\n  ],\n  defaultParams: ['increase'],\n});\n\nregister({\n  type: 'moving_window',\n  style: 'label',\n  label: 'Moving Window:',\n  params: [\n    {\n      name: 'function',\n      type: 'string',\n      options: ['avg'],\n    },\n    {\n      name: 'window_size',\n      type: 'number',\n      options: ['3', '5', '7', '10', '20'],\n    },\n  ],\n  defaultParams: ['avg', '5'],\n});\n\nexport default {\n  create: createPart,\n};\n","import { clone, filter, find, findIndex, indexOf, map } from 'lodash';\nimport appEvents from 'app/core/app_events';\nimport { PostgresMetaQuery } from './meta_query';\nimport { QueryCtrl } from 'app/plugins/sdk';\nimport { SqlPart } from 'app/angular/components/sql_part/sql_part';\nimport PostgresQueryModel from './postgres_query_model';\nimport sqlPart from './sql_part';\nimport { auto } from 'angular';\nimport { PanelEvents, QueryResultMeta } from '@grafana/data';\nimport { VariableWithMultiSupport } from 'app/features/variables/types';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { ShowConfirmModalEvent } from 'app/types/events';\n\nconst defaultQuery = `SELECT\n  $__time(time_column),\n  value1\nFROM\n  metric_table\nWHERE\n  $__timeFilter(time_column)\n`;\n\nexport class PostgresQueryCtrl extends QueryCtrl {\n  static templateUrl = 'partials/query.editor.html';\n\n  formats: any[];\n  queryModel: PostgresQueryModel;\n  metaBuilder: PostgresMetaQuery;\n  lastQueryMeta?: QueryResultMeta;\n  lastQueryError?: string;\n  showHelp = false;\n  tableSegment: any;\n  whereAdd: any;\n  timeColumnSegment: any;\n  metricColumnSegment: any;\n  selectMenu: any[] = [];\n  selectParts: SqlPart[][] = [[]];\n  groupParts: SqlPart[] = [];\n  whereParts: SqlPart[] = [];\n  groupAdd: any;\n\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    $injector: auto.IInjectorService,\n    private templateSrv: TemplateSrv,\n    private uiSegmentSrv: any\n  ) {\n    super($scope, $injector);\n    this.target = this.target;\n    this.queryModel = new PostgresQueryModel(this.target, templateSrv, this.panel.scopedVars);\n    this.metaBuilder = new PostgresMetaQuery(this.target, this.queryModel);\n    this.updateProjection();\n\n    this.formats = [\n      { text: 'Time series', value: 'time_series' },\n      { text: 'Table', value: 'table' },\n    ];\n\n    if (!this.target.rawSql) {\n      // special handling when in table panel\n      if (this.panelCtrl.panel.type === 'table') {\n        this.target.format = 'table';\n        this.target.rawSql = 'SELECT 1';\n        this.target.rawQuery = true;\n      } else {\n        this.target.rawSql = defaultQuery;\n        this.datasource.metricFindQuery(this.metaBuilder.findMetricTable()).then((result: any) => {\n          if (result.length > 0) {\n            this.target.table = result[0].text;\n            let segment = this.uiSegmentSrv.newSegment(this.target.table);\n            this.tableSegment.html = segment.html;\n            this.tableSegment.value = segment.value;\n\n            this.target.timeColumn = result[1].text;\n            segment = this.uiSegmentSrv.newSegment(this.target.timeColumn);\n            this.timeColumnSegment.html = segment.html;\n            this.timeColumnSegment.value = segment.value;\n\n            this.target.timeColumnType = 'timestamp';\n            this.target.select = [[{ type: 'column', params: [result[2].text] }]];\n            this.updateProjection();\n            this.updateRawSqlAndRefresh();\n          }\n        });\n      }\n    }\n\n    if (!this.target.table) {\n      this.tableSegment = uiSegmentSrv.newSegment({ value: 'select table', fake: true });\n    } else {\n      this.tableSegment = uiSegmentSrv.newSegment(this.target.table);\n    }\n\n    this.timeColumnSegment = uiSegmentSrv.newSegment(this.target.timeColumn);\n    this.metricColumnSegment = uiSegmentSrv.newSegment(this.target.metricColumn);\n\n    this.buildSelectMenu();\n    this.whereAdd = this.uiSegmentSrv.newPlusButton();\n    this.groupAdd = this.uiSegmentSrv.newPlusButton();\n\n    this.panelCtrl.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this), $scope);\n    this.panelCtrl.events.on(PanelEvents.dataError, this.onDataError.bind(this), $scope);\n  }\n\n  updateRawSqlAndRefresh() {\n    if (!this.target.rawQuery) {\n      this.target.rawSql = this.queryModel.buildQuery();\n    }\n\n    this.panelCtrl.refresh();\n  }\n\n  updateProjection() {\n    this.selectParts = map(this.target.select, (parts: any) => {\n      return map(parts, sqlPart.create).filter((n) => n);\n    });\n    this.whereParts = map(this.target.where, sqlPart.create).filter((n) => n);\n    this.groupParts = map(this.target.group, sqlPart.create).filter((n) => n);\n  }\n\n  updatePersistedParts() {\n    this.target.select = map(this.selectParts, (selectParts) => {\n      return map(selectParts, (part: any) => {\n        return { type: part.def.type, datatype: part.datatype, params: part.params };\n      });\n    });\n    this.target.where = map(this.whereParts, (part: any) => {\n      return { type: part.def.type, datatype: part.datatype, name: part.name, params: part.params };\n    });\n    this.target.group = map(this.groupParts, (part: any) => {\n      return { type: part.def.type, datatype: part.datatype, params: part.params };\n    });\n  }\n\n  buildSelectMenu() {\n    this.selectMenu = [];\n    const aggregates = {\n      text: 'Aggregate Functions',\n      value: 'aggregate',\n      submenu: [\n        { text: 'Average', value: 'avg' },\n        { text: 'Count', value: 'count' },\n        { text: 'Maximum', value: 'max' },\n        { text: 'Minimum', value: 'min' },\n        { text: 'Sum', value: 'sum' },\n        { text: 'Standard deviation', value: 'stddev' },\n        { text: 'Variance', value: 'variance' },\n      ],\n    };\n\n    // first and last aggregate are timescaledb specific\n    if (this.datasource.jsonData.timescaledb === true) {\n      aggregates.submenu.push({ text: 'First', value: 'first' });\n      aggregates.submenu.push({ text: 'Last', value: 'last' });\n    }\n\n    this.selectMenu.push(aggregates);\n\n    // ordered set aggregates require postgres 9.4+\n    if (this.datasource.jsonData.postgresVersion >= 904) {\n      const aggregates2 = {\n        text: 'Ordered-Set Aggregate Functions',\n        value: 'percentile',\n        submenu: [\n          { text: 'Percentile (continuous)', value: 'percentile_cont' },\n          { text: 'Percentile (discrete)', value: 'percentile_disc' },\n        ],\n      };\n      this.selectMenu.push(aggregates2);\n    }\n\n    const windows = {\n      text: 'Window Functions',\n      value: 'window',\n      submenu: [\n        { text: 'Delta', value: 'delta' },\n        { text: 'Increase', value: 'increase' },\n        { text: 'Rate', value: 'rate' },\n        { text: 'Sum', value: 'sum' },\n        { text: 'Moving Average', value: 'avg', type: 'moving_window' },\n      ],\n    };\n    this.selectMenu.push(windows);\n\n    this.selectMenu.push({ text: 'Alias', value: 'alias' });\n    this.selectMenu.push({ text: 'Column', value: 'column' });\n  }\n\n  toggleEditorMode() {\n    if (this.target.rawQuery) {\n      appEvents.publish(\n        new ShowConfirmModalEvent({\n          title: 'Warning',\n          text2: 'Switching to query builder may overwrite your raw SQL.',\n          icon: 'exclamation-triangle',\n          yesText: 'Switch',\n          onConfirm: () => {\n            // This could be called from React, so wrap in $evalAsync.\n            // Will then either run as part of the current digest cycle or trigger a new one.\n            this.$scope.$evalAsync(() => {\n              this.target.rawQuery = !this.target.rawQuery;\n            });\n          },\n        })\n      );\n    } else {\n      // This could be called from React, so wrap in $evalAsync.\n      // Will then either run as part of the current digest cycle or trigger a new one.\n      this.$scope.$evalAsync(() => {\n        this.target.rawQuery = !this.target.rawQuery;\n      });\n    }\n  }\n\n  resetPlusButton(button: { html: any; value: any; type: any; fake: any }) {\n    const plusButton = this.uiSegmentSrv.newPlusButton();\n    button.html = plusButton.html;\n    button.value = plusButton.value;\n    button.type = plusButton.type;\n    button.fake = plusButton.fake;\n  }\n\n  getTableSegments() {\n    return this.datasource\n      .metricFindQuery(this.metaBuilder.buildTableQuery())\n      .then(this.transformToSegments({}))\n      .catch(this.handleQueryError.bind(this));\n  }\n\n  tableChanged() {\n    this.target.table = this.tableSegment.value;\n    this.target.where = [];\n    this.target.group = [];\n    this.updateProjection();\n\n    const segment = this.uiSegmentSrv.newSegment('none');\n    this.metricColumnSegment.html = segment.html;\n    this.metricColumnSegment.value = segment.value;\n    this.target.metricColumn = 'none';\n\n    const task1 = this.datasource.metricFindQuery(this.metaBuilder.buildColumnQuery('time')).then((result: any) => {\n      // check if time column is still valid\n      if (result.length > 0 && !find(result, (r: any) => r.text === this.target.timeColumn)) {\n        const segment = this.uiSegmentSrv.newSegment(result[0].text);\n        this.timeColumnSegment.html = segment.html;\n        this.timeColumnSegment.value = segment.value;\n      }\n      return this.timeColumnChanged(false);\n    });\n    const task2 = this.datasource.metricFindQuery(this.metaBuilder.buildColumnQuery('value')).then((result: any) => {\n      if (result.length > 0) {\n        this.target.select = [[{ type: 'column', params: [result[0].text] }]];\n        this.updateProjection();\n      }\n    });\n\n    Promise.all([task1, task2]).then(() => {\n      this.updateRawSqlAndRefresh();\n    });\n  }\n\n  getTimeColumnSegments() {\n    return this.datasource\n      .metricFindQuery(this.metaBuilder.buildColumnQuery('time'))\n      .then(this.transformToSegments({}))\n      .catch(this.handleQueryError.bind(this));\n  }\n\n  timeColumnChanged(refresh?: boolean) {\n    this.target.timeColumn = this.timeColumnSegment.value;\n    return this.datasource\n      .metricFindQuery(this.metaBuilder.buildDatatypeQuery(this.target.timeColumn))\n      .then((result: any) => {\n        if (result.length === 1) {\n          if (this.target.timeColumnType !== result[0].text) {\n            this.target.timeColumnType = result[0].text;\n          }\n          let partModel;\n          if (this.queryModel.hasUnixEpochTimecolumn()) {\n            partModel = sqlPart.create({ type: 'macro', name: '$__unixEpochFilter', params: [] });\n          } else {\n            partModel = sqlPart.create({ type: 'macro', name: '$__timeFilter', params: [] });\n          }\n\n          if (this.whereParts.length >= 1 && this.whereParts[0].def.type === 'macro') {\n            // replace current macro\n            this.whereParts[0] = partModel;\n          } else {\n            this.whereParts.splice(0, 0, partModel);\n          }\n        }\n\n        this.updatePersistedParts();\n        if (refresh !== false) {\n          this.updateRawSqlAndRefresh();\n        }\n      });\n  }\n\n  getMetricColumnSegments() {\n    return this.datasource\n      .metricFindQuery(this.metaBuilder.buildColumnQuery('metric'))\n      .then(this.transformToSegments({ addNone: true }))\n      .catch(this.handleQueryError.bind(this));\n  }\n\n  metricColumnChanged() {\n    this.target.metricColumn = this.metricColumnSegment.value;\n    this.updateRawSqlAndRefresh();\n  }\n\n  onDataReceived(dataList: any) {\n    this.lastQueryError = undefined;\n    this.lastQueryMeta = dataList[0]?.meta;\n  }\n\n  onDataError(err: any) {\n    if (err.data && err.data.results) {\n      const queryRes = err.data.results[this.target.refId];\n      if (queryRes) {\n        this.lastQueryError = queryRes.error;\n      }\n    }\n  }\n\n  transformToSegments(config: { addNone?: any; addTemplateVars?: any; templateQuoter?: any }) {\n    return (results: any) => {\n      const segments = map(results, (segment) => {\n        return this.uiSegmentSrv.newSegment({\n          value: segment.text,\n          expandable: segment.expandable,\n        });\n      });\n\n      if (config.addTemplateVars) {\n        for (const variable of this.templateSrv.getVariables()) {\n          let value;\n          value = '$' + variable.name;\n          if (config.templateQuoter && ((variable as unknown) as VariableWithMultiSupport).multi === false) {\n            value = config.templateQuoter(value);\n          }\n\n          segments.unshift(\n            this.uiSegmentSrv.newSegment({\n              type: 'template',\n              value: value,\n              expandable: true,\n            })\n          );\n        }\n      }\n\n      if (config.addNone) {\n        segments.unshift(this.uiSegmentSrv.newSegment({ type: 'template', value: 'none', expandable: true }));\n      }\n\n      return segments;\n    };\n  }\n\n  findAggregateIndex(selectParts: any) {\n    return findIndex(selectParts, (p: any) => p.def.type === 'aggregate' || p.def.type === 'percentile');\n  }\n\n  findWindowIndex(selectParts: any) {\n    return findIndex(selectParts, (p: any) => p.def.type === 'window' || p.def.type === 'moving_window');\n  }\n\n  addSelectPart(selectParts: any[], item: { value: any }, subItem: { type: any; value: any }) {\n    let partType = item.value;\n    if (subItem && subItem.type) {\n      partType = subItem.type;\n    }\n    let partModel = sqlPart.create({ type: partType });\n    if (subItem) {\n      partModel.params[0] = subItem.value;\n    }\n    let addAlias = false;\n\n    switch (partType) {\n      case 'column':\n        const parts = map(selectParts, (part: any) => {\n          return sqlPart.create({ type: part.def.type, params: clone(part.params) });\n        });\n        this.selectParts.push(parts);\n        break;\n      case 'percentile':\n      case 'aggregate':\n        // add group by if no group by yet\n        if (this.target.group.length === 0) {\n          this.addGroup('time', '$__interval');\n        }\n        const aggIndex = this.findAggregateIndex(selectParts);\n        if (aggIndex !== -1) {\n          // replace current aggregation\n          selectParts[aggIndex] = partModel;\n        } else {\n          selectParts.splice(1, 0, partModel);\n        }\n        if (!find(selectParts, (p: any) => p.def.type === 'alias')) {\n          addAlias = true;\n        }\n        break;\n      case 'moving_window':\n      case 'window':\n        const windowIndex = this.findWindowIndex(selectParts);\n        if (windowIndex !== -1) {\n          // replace current window function\n          selectParts[windowIndex] = partModel;\n        } else {\n          const aggIndex = this.findAggregateIndex(selectParts);\n          if (aggIndex !== -1) {\n            selectParts.splice(aggIndex + 1, 0, partModel);\n          } else {\n            selectParts.splice(1, 0, partModel);\n          }\n        }\n        if (!find(selectParts, (p: any) => p.def.type === 'alias')) {\n          addAlias = true;\n        }\n        break;\n      case 'alias':\n        addAlias = true;\n        break;\n    }\n\n    if (addAlias) {\n      // set initial alias name to column name\n      partModel = sqlPart.create({ type: 'alias', params: [selectParts[0].params[0].replace(/\"/g, '')] });\n      if (selectParts[selectParts.length - 1].def.type === 'alias') {\n        selectParts[selectParts.length - 1] = partModel;\n      } else {\n        selectParts.push(partModel);\n      }\n    }\n\n    this.updatePersistedParts();\n    this.updateRawSqlAndRefresh();\n  }\n\n  removeSelectPart(selectParts: any, part: { def: { type: string } }) {\n    if (part.def.type === 'column') {\n      // remove all parts of column unless its last column\n      if (this.selectParts.length > 1) {\n        const modelsIndex = indexOf(this.selectParts, selectParts);\n        this.selectParts.splice(modelsIndex, 1);\n      }\n    } else {\n      const partIndex = indexOf(selectParts, part);\n      selectParts.splice(partIndex, 1);\n    }\n\n    this.updatePersistedParts();\n  }\n\n  handleSelectPartEvent(selectParts: any, part: { def: any }, evt: { name: any }) {\n    switch (evt.name) {\n      case 'get-param-options': {\n        switch (part.def.type) {\n          case 'aggregate':\n            return this.datasource\n              .metricFindQuery(this.metaBuilder.buildAggregateQuery())\n              .then(this.transformToSegments({}))\n              .catch(this.handleQueryError.bind(this));\n          case 'column':\n            return this.datasource\n              .metricFindQuery(this.metaBuilder.buildColumnQuery('value'))\n              .then(this.transformToSegments({}))\n              .catch(this.handleQueryError.bind(this));\n        }\n      }\n      case 'part-param-changed': {\n        this.updatePersistedParts();\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'action': {\n        this.removeSelectPart(selectParts, part);\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'get-part-actions': {\n        return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n      }\n    }\n  }\n\n  handleGroupPartEvent(part: any, index: any, evt: { name: any }) {\n    switch (evt.name) {\n      case 'get-param-options': {\n        return this.datasource\n          .metricFindQuery(this.metaBuilder.buildColumnQuery())\n          .then(this.transformToSegments({}))\n          .catch(this.handleQueryError.bind(this));\n      }\n      case 'part-param-changed': {\n        this.updatePersistedParts();\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'action': {\n        this.removeGroup(part, index);\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'get-part-actions': {\n        return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n      }\n    }\n  }\n\n  addGroup(partType: string, value: string) {\n    let params = [value];\n    if (partType === 'time') {\n      params = ['$__interval', 'none'];\n    }\n    const partModel = sqlPart.create({ type: partType, params: params });\n\n    if (partType === 'time') {\n      // put timeGroup at start\n      this.groupParts.splice(0, 0, partModel);\n    } else {\n      this.groupParts.push(partModel);\n    }\n\n    // add aggregates when adding group by\n    for (const selectParts of this.selectParts) {\n      if (!selectParts.some((part) => part.def.type === 'aggregate')) {\n        const aggregate = sqlPart.create({ type: 'aggregate', params: ['avg'] });\n        selectParts.splice(1, 0, aggregate);\n        if (!selectParts.some((part) => part.def.type === 'alias')) {\n          const alias = sqlPart.create({ type: 'alias', params: [selectParts[0].part.params[0]] });\n          selectParts.push(alias);\n        }\n      }\n    }\n\n    this.updatePersistedParts();\n  }\n\n  removeGroup(part: { def: { type: string } }, index: number) {\n    if (part.def.type === 'time') {\n      // remove aggregations\n      this.selectParts = map(this.selectParts, (s: any) => {\n        return filter(s, (part: any) => {\n          if (part.def.type === 'aggregate' || part.def.type === 'percentile') {\n            return false;\n          }\n          return true;\n        });\n      });\n    }\n\n    this.groupParts.splice(index, 1);\n    this.updatePersistedParts();\n  }\n\n  handleWherePartEvent(whereParts: any, part: any, evt: any, index: any) {\n    switch (evt.name) {\n      case 'get-param-options': {\n        switch (evt.param.name) {\n          case 'left':\n            return this.datasource\n              .metricFindQuery(this.metaBuilder.buildColumnQuery())\n              .then(this.transformToSegments({}))\n              .catch(this.handleQueryError.bind(this));\n          case 'right':\n            if (['int4', 'int8', 'float4', 'float8', 'timestamp', 'timestamptz'].indexOf(part.datatype) > -1) {\n              // don't do value lookups for numerical fields\n              return Promise.resolve([]);\n            } else {\n              return this.datasource\n                .metricFindQuery(this.metaBuilder.buildValueQuery(part.params[0]))\n                .then(\n                  this.transformToSegments({\n                    addTemplateVars: true,\n                    templateQuoter: (v: string) => {\n                      return this.queryModel.quoteLiteral(v);\n                    },\n                  })\n                )\n                .catch(this.handleQueryError.bind(this));\n            }\n          case 'op':\n            return Promise.resolve(this.uiSegmentSrv.newOperators(this.metaBuilder.getOperators(part.datatype)));\n          default:\n            return Promise.resolve([]);\n        }\n      }\n      case 'part-param-changed': {\n        this.updatePersistedParts();\n        this.datasource.metricFindQuery(this.metaBuilder.buildDatatypeQuery(part.params[0])).then((d: any) => {\n          if (d.length === 1) {\n            part.datatype = d[0].text;\n          }\n        });\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'action': {\n        // remove element\n        whereParts.splice(index, 1);\n        this.updatePersistedParts();\n        this.updateRawSqlAndRefresh();\n        break;\n      }\n      case 'get-part-actions': {\n        return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n      }\n    }\n  }\n\n  getWhereOptions() {\n    const options = [];\n    if (this.queryModel.hasUnixEpochTimecolumn()) {\n      options.push(this.uiSegmentSrv.newSegment({ type: 'macro', value: '$__unixEpochFilter' }));\n    } else {\n      options.push(this.uiSegmentSrv.newSegment({ type: 'macro', value: '$__timeFilter' }));\n    }\n    options.push(this.uiSegmentSrv.newSegment({ type: 'expression', value: 'Expression' }));\n    return Promise.resolve(options);\n  }\n\n  addWhereAction(part: any, index: any) {\n    switch (this.whereAdd.type) {\n      case 'macro': {\n        const partModel = sqlPart.create({ type: 'macro', name: this.whereAdd.value, params: [] });\n        if (this.whereParts.length >= 1 && this.whereParts[0].def.type === 'macro') {\n          // replace current macro\n          this.whereParts[0] = partModel;\n        } else {\n          this.whereParts.splice(0, 0, partModel);\n        }\n        break;\n      }\n      default: {\n        this.whereParts.push(sqlPart.create({ type: 'expression', params: ['value', '=', 'value'] }));\n      }\n    }\n\n    this.updatePersistedParts();\n    this.resetPlusButton(this.whereAdd);\n    this.updateRawSqlAndRefresh();\n  }\n\n  getGroupOptions() {\n    return this.datasource\n      .metricFindQuery(this.metaBuilder.buildColumnQuery('group'))\n      .then((tags: any) => {\n        const options = [];\n        if (!this.queryModel.hasTimeGroup()) {\n          options.push(this.uiSegmentSrv.newSegment({ type: 'time', value: 'time($__interval,none)' }));\n        }\n        for (const tag of tags) {\n          options.push(this.uiSegmentSrv.newSegment({ type: 'column', value: tag.text }));\n        }\n        return options;\n      })\n      .catch(this.handleQueryError.bind(this));\n  }\n\n  addGroupAction() {\n    this.addGroup(this.groupAdd.type, this.groupAdd.value);\n    this.resetPlusButton(this.groupAdd);\n    this.updateRawSqlAndRefresh();\n  }\n\n  handleQueryError(err: any): any[] {\n    this.error = err.message || 'Failed to issue metric query';\n    return [];\n  }\n}\n","import { find } from 'lodash';\nimport {\n  createChangeHandler,\n  createResetHandler,\n  PasswordFieldEnum,\n} from '../../../features/datasources/utils/passwordHandlers';\nimport DatasourceSrv from 'app/features/plugins/datasource_srv';\n\nexport class PostgresConfigCtrl {\n  static templateUrl = 'partials/config.html';\n\n  // Set through angular bindings\n  declare current: any;\n\n  datasourceSrv: any;\n  showTimescaleDBHelp: boolean;\n  onPasswordReset: ReturnType<typeof createResetHandler>;\n  onPasswordChange: ReturnType<typeof createChangeHandler>;\n\n  /** @ngInject */\n  constructor($scope: any, datasourceSrv: DatasourceSrv) {\n    this.current = $scope.ctrl.current;\n    this.datasourceSrv = datasourceSrv;\n    this.current.jsonData.sslmode = this.current.jsonData.sslmode || 'verify-full';\n    this.current.jsonData.tlsConfigurationMethod = this.current.jsonData.tlsConfigurationMethod || 'file-path';\n    this.current.jsonData.postgresVersion = this.current.jsonData.postgresVersion || 903;\n    this.showTimescaleDBHelp = false;\n    this.autoDetectFeatures();\n    this.onPasswordReset = createResetHandler(this, PasswordFieldEnum.Password);\n    this.onPasswordChange = createChangeHandler(this, PasswordFieldEnum.Password);\n    this.tlsModeMapping();\n  }\n\n  autoDetectFeatures() {\n    if (!this.current.id) {\n      return;\n    }\n\n    this.datasourceSrv.loadDatasource(this.current.name).then((ds: any) => {\n      return ds.getVersion().then((version: any) => {\n        version = Number(version[0].text);\n\n        // timescaledb is only available for 9.6+\n        if (version >= 906) {\n          ds.getTimescaleDBVersion().then((version: any) => {\n            if (version.length === 1) {\n              this.current.jsonData.timescaledb = true;\n            }\n          });\n        }\n\n        const major = Math.trunc(version / 100);\n        const minor = version % 100;\n        let name = String(major);\n        if (version < 1000) {\n          name = String(major) + '.' + String(minor);\n        }\n        if (!find(this.postgresVersions, (p: any) => p.value === version)) {\n          this.postgresVersions.push({ name: name, value: version });\n        }\n        this.current.jsonData.postgresVersion = version;\n      });\n    });\n  }\n\n  toggleTimescaleDBHelp() {\n    this.showTimescaleDBHelp = !this.showTimescaleDBHelp;\n  }\n\n  tlsModeMapping() {\n    if (this.current.jsonData.sslmode === 'disable') {\n      this.current.jsonData.tlsAuth = false;\n      this.current.jsonData.tlsAuthWithCACert = false;\n      this.current.jsonData.tlsSkipVerify = true;\n    } else {\n      this.current.jsonData.tlsAuth = true;\n      this.current.jsonData.tlsAuthWithCACert = true;\n      this.current.jsonData.tlsSkipVerify = false;\n    }\n  }\n\n  // the value portion is derived from postgres server_version_num/100\n  postgresVersions = [\n    { name: '9.3', value: 903 },\n    { name: '9.4', value: 904 },\n    { name: '9.5', value: 905 },\n    { name: '9.6', value: 906 },\n    { name: '10', value: 1000 },\n    { name: '11', value: 1100 },\n    { name: '12+', value: 1200 },\n  ];\n}\n","import { PostgresDatasource } from './datasource';\nimport { PostgresQueryCtrl } from './query_ctrl';\nimport { PostgresConfigCtrl } from './config_ctrl';\nimport { PostgresQuery } from './types';\nimport { DataSourcePlugin } from '@grafana/data';\n\nconst defaultQuery = `SELECT\n  extract(epoch from time_column) AS time,\n  text_column as text,\n  tags_column as tags\nFROM\n  metric_table\nWHERE\n  $__timeFilter(time_column)\n`;\n\nclass PostgresAnnotationsQueryCtrl {\n  static templateUrl = 'partials/annotations.editor.html';\n\n  declare annotation: any;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    this.annotation = $scope.ctrl.annotation;\n    this.annotation.rawQuery = this.annotation.rawQuery || defaultQuery;\n  }\n}\n\nexport const plugin = new DataSourcePlugin<PostgresDatasource, PostgresQuery>(PostgresDatasource)\n  .setQueryCtrl(PostgresQueryCtrl)\n  .setConfigCtrl(PostgresConfigCtrl)\n  .setAnnotationQueryCtrl(PostgresAnnotationsQueryCtrl);\n"],"names":["SqlPartDef","constructor","options","this","type","label","toUpperCase","substring","style","wrapOpen","wrapClose","separator","params","defaultParams","SqlPart","part","def","message","datatype","name","clone","updateParam","strValue","index","optional","splice","PasswordFieldEnum","createResetHandler","ctrl","field","event","preventDefault","current","undefined","secureJsonFields","secureJsonData","createChangeHandler","currentTarget","value","ResponseParser","transformMetricFindResponse","raw","frames","toDataQueryResponse","data","length","frame","values","textField","fields","find","f","valueField","i","push","text","get","flatMap","toArray","map","v","Array","from","Set","timeField","Error","timeEndField","tagsField","list","timeEnd","Math","floor","annotation","time","tags","trim","split","PostgresQueryModel","target","templateSrv","scopedVars","format","timeColumn","metricColumn","group","where","select","rawQuery","interpolateQueryStr","bind","unquoteIdentifier","replace","quoteIdentifier","String","quoteLiteral","escapeLiteral","hasTimeGroup","g","hasMetricColumn","variable","defaultFormatFn","multi","includeAll","join","render","interpolate","rawSql","buildQuery","hasUnixEpochTimecolumn","indexOf","timeColumnType","buildTimeColumn","alias","timeGroup","query","macro","args","buildMetricColumn","buildValueColumns","column","buildValueColumn","aggregate","windows","func","overParts","over","curr","prev","buildWhereClause","conditions","tag","buildGroupClause","groupSection","table","PostgresDatasource","DataSourceWithBackend","instanceSettings","getTemplateSrv","timeSrv","getTimeSrv","super","queryModel","_map","id","jsonData","responseParser","settingsData","interval","timeInterval","interpolateVariablesInQueries","queries","expandedQueries","datasource","getRef","interpolateVariable","filterQuery","hide","applyTemplateVariables","refId","Promise","reject","lastValueFrom","getBackendSrv","fetch","url","method","range","valueOf","toString","to","requestId","pipe","async","transformAnnotationResponse","res","metricFindQuery","optionalOptions","getSearchFilterScopedVar","wildcardChar","interpolatedQuery","timeRange","rsp","catchError","err","of","_metaRequest","getVersion","getTimescaleDBVersion","testDatasource","then","status","catch","toTestingStatus","targetContainsTemplate","variableExists","PostgresMetaQuery","getOperators","quoteIdentAsLiteral","findMetricTable","buildSchemaConstraint","buildTableConstraint","includes","parts","buildTableQuery","buildColumnQuery","buildValueQuery","buildDatatypeQuery","buildAggregateQuery","register","dynamicLookup","quote","create","PostgresQueryCtrl","QueryCtrl","$scope","$injector","uiSegmentSrv","panel","metaBuilder","updateProjection","formats","panelCtrl","result","segment","newSegment","tableSegment","html","timeColumnSegment","updateRawSqlAndRefresh","fake","metricColumnSegment","buildSelectMenu","whereAdd","newPlusButton","groupAdd","events","on","PanelEvents","onDataReceived","onDataError","refresh","selectParts","sqlPart","filter","n","whereParts","groupParts","updatePersistedParts","selectMenu","aggregates","submenu","timescaledb","postgresVersion","aggregates2","toggleEditorMode","appEvents","ShowConfirmModalEvent","title","text2","icon","yesText","onConfirm","$evalAsync","resetPlusButton","button","plusButton","getTableSegments","transformToSegments","handleQueryError","tableChanged","task1","r","timeColumnChanged","task2","all","getTimeColumnSegments","partModel","getMetricColumnSegments","addNone","metricColumnChanged","dataList","lastQueryError","lastQueryMeta","meta","results","queryRes","error","config","segments","expandable","addTemplateVars","getVariables","templateQuoter","unshift","findAggregateIndex","findIndex","p","findWindowIndex","addSelectPart","item","subItem","partType","addAlias","addGroup","aggIndex","windowIndex","removeSelectPart","modelsIndex","partIndex","handleSelectPartEvent","evt","resolve","handleGroupPartEvent","removeGroup","some","s","handleWherePartEvent","param","newOperators","d","getWhereOptions","addWhereAction","getGroupOptions","addGroupAction","PostgresConfigCtrl","datasourceSrv","sslmode","tlsConfigurationMethod","showTimescaleDBHelp","autoDetectFeatures","onPasswordReset","onPasswordChange","tlsModeMapping","loadDatasource","ds","version","Number","major","trunc","minor","postgresVersions","toggleTimescaleDBHelp","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","PostgresAnnotationsQueryCtrl","plugin","DataSourcePlugin","setQueryCtrl","setConfigCtrl","setAnnotationQueryCtrl"],"sourceRoot":""}