{"version":3,"sources":["jsdelivr-header.js","/npm/druid-query-toolkit@1.2.2/src/index.ts","/npm/druid-query-toolkit@1.2.2/src/utils.ts","/npm/druid-query-toolkit@1.2.2/src/sql/helpers/general/general.ts","/npm/druid-query-toolkit@1.2.2/src/sql/allowed-functions.ts","/npm/druid-query-toolkit@1.2.2/src/sql/reserved-keywords.ts","/npm/druid-query-toolkit@1.2.2/src/sql/helpers/ref-name/ref-name.ts","/npm/druid-query-toolkit@1.2.2/src/sql/helpers/separated-array/separated-array.ts","/npm/druid-query-toolkit@1.2.2/src/sql/helpers/separator/separator.ts","/npm/druid-query-toolkit@1.2.2/src/sql/parser/index.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-base.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-expression.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-type/sql-type.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-column-list/sql-column-list.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-placeholder/sql-placeholder.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-literal/sql-literal.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-interval/sql-interval.ts","/npm/druid-query-toolkit@1.2.2/src/sql/special-functions.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-order-by-expression/sql-order-by-expression.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-order-by-clause/sql-order-by-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-from-clause/sql-join-part.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-star/sql-star.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-table/sql-table.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-column/sql-column.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-set-statement/sql-set-statement.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-with-query/sql-with-query.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-query/sql-query.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-from-clause/sql-from-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-group-by-clause/sql-group-by-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-multi/sql-multi.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-where-clause/sql-where-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-having-clause/sql-having-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-limit-clause/sql-limit-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-offset-clause/sql-offset-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-partitioned-by-clause/sql-partitioned-by-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-clustered-by-clause/sql-clustered-by-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-with-clause/sql-with-part.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-with-clause/sql-with-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-insert-clause/sql-insert-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-replace-clause/sql-replace-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-extend-clause/sql-column-declaration.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-extend-clause/sql-extend-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-clause/sql-partition-by-clause/sql-partition-by-clause.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-key-value/sql-key-value.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-labeled-expression/sql-labeled-expression.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-function/sql-function.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-namespace/sql-namespace.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-unary/sql-unary.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-comparison/sql-between-part.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-comparison/sql-like-part.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-record/sql-record.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-comparison/sql-comparison.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-case/sql-when-then-part.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-case/sql-case.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-alias/sql-alias.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-window-spec/sql-window-spec.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-window-spec/sql-frame-bound.ts","/npm/druid-query-toolkit@1.2.2/src/sql/sql-values/sql-values.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/column.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/function.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/literal.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/namespace.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/table.ts","/npm/druid-query-toolkit@1.2.2/src/shortcuts/template.ts","/npm/druid-query-toolkit@1.2.2/src/introspect/introspect.ts","/npm/druid-query-toolkit@1.2.2/src/query-result/column.ts","/npm/druid-query-toolkit@1.2.2/src/query-result/query-result.ts","/npm/druid-query-toolkit@1.2.2/src/query-runner/query-runner.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/common.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-contains.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-custom.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-mv-contains.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-number-range.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-regexp.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-time-interval.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-time-relative.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/pattern-values.ts","/npm/druid-query-toolkit@1.2.2/src/filter-pattern/unify.ts"],"names":[],"mappings":"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ACA,UACA,UACA,QACA,YACA,aACA,YACA,SACA,OACA,aACA,WACA,UACA,QACA,SACA,MACA,UACA,cACA,QACA,SACA,WACA,OACA,eACA,WACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,MACA,aACA,OACA,OACA,KACA,QACA,YACA,iBACA,QACA,eACA,MACA,MACA,SACA,MACA,QACA,WACA,OACA,MACA,YACA,QACA,SACA,eACA,UACA,kBACA,kBACA,eACA,SACA,WACA,QACA,OACA,OACA,aACA,WACA,WACA,QACA,MACA,aACA,SACA,OACA,OACA,aACA,cACA,SACA,YACA,MACA,QACA,OACA,YACA,YACA,OACA,WACA,SACA,SACA,QACA,OACA,UACA,WACA,QCpGW,kBAAoB,CAC/B,MACA,MACA,WACA,QACA,QACA,MACA,MACA,MACA,QACA,wBACA,KACA,aACA,aACA,KACA,SACA,gBACA,MACA,QACA,cACA,kBACA,UACA,SACA,SACA,MACA,OACA,UACA,OACA,KACA,OACA,SACA,cACA,WACA,OACA,OACA,OACA,UACA,OACA,YACA,mBACA,cACA,QACA,aACA,OACA,QACA,YACA,WACA,UACA,UACA,SACA,SACA,YACA,UACA,aACA,WACA,UACA,OACA,gBACA,QACA,YACA,aACA,SACA,QACA,OACA,YACA,UACA,eACA,cACA,eACA,oBACA,mCACA,SACA,QACA,OACA,MACA,aACA,MACA,UACA,UACA,UACA,SACA,SACA,aACA,QACA,WACA,gBACA,WACA,aACA,WACA,SACA,OACA,UACA,OACA,UACA,OACA,QACA,MACA,YACA,gBACA,SACA,SACA,QACA,SACA,OACA,UACA,SACA,MACA,UACA,SACA,WACA,UACA,QACA,QACA,SACA,cACA,QACA,QACA,MACA,UACA,YACA,OACA,OACA,OACA,WACA,SACA,MACA,SACA,QACA,QACA,WACA,SACA,SACA,OACA,OACA,WACA,SACA,KACA,YACA,UACA,QACA,QACA,cACA,SACA,MACA,UACA,YACA,eACA,WACA,OACA,KACA,OACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,MACA,WACA,QACA,aACA,UACA,OACA,UACA,OACA,OACA,aACA,QACA,KACA,QACA,YACA,iBACA,QACA,QACA,UACA,eACA,kBACA,MACA,WACA,SACA,QACA,SACA,MACA,QACA,SACA,MACA,WACA,SACA,QACA,WACA,WACA,UACA,QACA,QACA,MACA,OACA,KACA,OACA,YACA,MACA,YACA,QACA,OACA,SACA,UACA,oBACA,eACA,KACA,SACA,MACA,OACA,KACA,MACA,OACA,OACA,KACA,QACA,MACA,QACA,OACA,WACA,UACA,YACA,YACA,cACA,UACA,MACA,UACA,kBACA,kBACA,eACA,SACA,UACA,UACA,WACA,iBACA,QACA,WACA,YACA,UACA,OACA,UACA,YACA,QACA,OACA,QACA,OACA,YACA,MACA,aACA,cACA,YACA,YACA,aACA,iBACA,aACA,WACA,WACA,WACA,UACA,QACA,SACA,SACA,UACA,SACA,QACA,WACA,SACA,MACA,OACA,aACA,UACA,YACA,QACA,SACA,SACA,SACA,OACA,SACA,YACA,MACA,OACA,UACA,OACA,WACA,OACA,WACA,eACA,MACA,eACA,WACA,aACA,OACA,QACA,SACA,aACA,cACA,SACA,cACA,SACA,YACA,kBACA,WACA,MACA,YACA,SACA,cACA,QACA,cACA,OACA,OACA,YACA,gBACA,kBACA,UACA,KACA,WACA,YACA,kBACA,cACA,QACA,UACA,OACA,aACA,OACA,WACA,UACA,QACA,SACA,UACA,SACA,SACA,QACA,SACA,QACA,QACA,SACA,WACA,YACA,UACA,UACA,UACA,WACA,aACA,OACA,WACA,QACA,eACA,SACA,OACA,SACA,UACA,QAGW,iBAAmB,CAC9B,kBACA,kCACA,eACA,eACA,iBACA,eACA,eACA,cACA,QCzWI,wBAA0B,eAE1B,sBAAiD,CAAC,EACxD,UAAW,KAAK,kBACd,sBAAsB,IAAK,EAG7B,IAAM,oBAA+C,CAAC,EACtD,UAAW,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IACT,EAAS,IACT,EAAS,IACT,EAAS,OACT,EAAS,QACT,EAAS,OACT,EAAS,QACT,EAAS,QACT,EAAS,KACT,EAAU,KACV,EAAU,KACV,EAAU,KACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,KACV,EAAU,IACV,EAAU,IACV,EAAU,SACV,EAAU,SACV,EAAU,OACV,EAAU,MACV,EAAU,OACV,EAAU,QACV,EAAU,UACV,EAAU,OACV,EAAU,QACV,EAAU,cACV,EAAU,cACV,EAAU,MACV,EAAU,SACV,EAAU,MACV,EAAU,UACV,EAAU,SACV,EAAU,UACV,EAAU,aACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,EAAU,IACV,GAAU,IACV,GAAU,IACV,GAAU,KACV,GAAU,KACV,GAAU,KACV,GAAU,KACV,GAAU,KACV,GAAU,KACV,GAAU,KACV,GAAU,IACV,GAAU,IACV,GAAU,MACV,GAAU,MACV,GAAU,MACV,GAAU,QACV,GAAU,KACV,GAAU,MACV,GAAU,UACV,GAAU,OACV,GAAU,OACV,GAAU,OACV,GAAU,OACV,GAAU,YACV,GAAU,KACV,GAAU,QACV,GAAU,MACV,GAAU,UACV,GAAU,MACV,GAAU,OACV,GAAU,OACV,GAAU,OACV,GAAU,WACV,GAAU,OACV,GAAU,MACV,GAAU,SACV,GAAU,UACV,GAAU,OACV,GAAU,MACV,GAAU,SACV,GAAU,UACV,GAAU,QACV,GAAU,SACV,GAAU,QACV,GAAU,YACV,GAAU,OACV,GAAU,QACV,GAAU,WACV,GAAU,OACV,GAAU,SACV,GAAU,KACV,GAAU,SACV,GAAU,WACV,GAAU,OACV,GAAU,KACV,GAAW,OACX,GAAW,aACX,GAAW,cACX,GAAW,MACX,GAAW,QACX,GAAW,UACX,GAAW,OACX,GAAW,QACX,GAAW,UACX,GAAW,MACX,GAAW,OACX,GAAW,SACX,GAAW,KACX,GAAW,KACX,GAAW,QACX,GAAW,QACX,GAAW,OACX,GAAW,YACX,GAAW,cACX,GAAW,YACX,GAAW,WACX,GAAW,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","file":"/npm/druid-query-toolkit@1.2.2/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/druid-query-toolkit@1.2.2/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable simple-import-sort/exports */\nexport * from './utils';\nexport * from './sql';\nexport * from './shortcuts';\nexport * from './introspect/introspect';\nexport * from './query-result';\nexport * from './query-runner/query-runner';\nexport * from './query-payload/query-payload';\nexport * from './filter-pattern';\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function cleanObject(obj: Record<string, any>): Record<string, string> {\n  const cleanObj: Record<string, string> = {};\n  for (const k in obj) {\n    const v = obj[k];\n    if (typeof v === 'string') cleanObj[k] = v;\n  }\n  return cleanObj;\n}\n\nexport function filterMap<T, Q>(xs: readonly T[], f: (x: T, i: number) => Q | undefined): Q[] {\n  return xs.map(f).filter((x: Q | undefined) => typeof x !== 'undefined') as Q[];\n}\n\nexport function objectMap<T, Q>(\n  obj: Record<string, T>,\n  f: (x: T, key: string) => Q | undefined,\n): Record<string, Q> {\n  const ret: Record<string, Q> = {};\n  for (const k in obj) {\n    const v = f(obj[k]!, k);\n    if (typeof v !== 'undefined') {\n      ret[k] = v;\n    }\n  }\n  return ret;\n}\n\nexport function dedupe<T>(array: readonly T[], keyFn: (x: T) => string = String): T[] {\n  const seen = new Map<any, boolean>();\n  const deduped: T[] = [];\n  array.forEach(d => {\n    const key = keyFn(d);\n    if (seen.has(key)) return;\n    seen.set(key, true);\n    deduped.push(d);\n  });\n  return deduped;\n}\n\nexport function isEmptyArray(x: unknown): x is unknown[] {\n  return Array.isArray(x) && !x.length;\n}\n\nexport function isDate(v: any): v is Date {\n  return Boolean(v && typeof v.toISOString === 'function');\n}\n\nexport function isInteger(v: number): boolean {\n  return isFinite(v) && Math.floor(v) === v;\n}\n\n/**\n * @deprecated, do not use, will be removed\n */\nexport function compact<T>(xs: (T | undefined | false | null | '')[]): T[] {\n  return xs.filter(Boolean) as T[];\n}\n\nexport function cleanFunctionArguments<T>(xs: (T | undefined)[]): T[] {\n  let n = xs.length;\n  while (n > 0 && typeof xs[n - 1] === 'undefined') n--;\n  return xs.slice(0, n).map(x => (typeof x === 'undefined' ? null : x)) as T[];\n}\n\n// To be used as a tag\nexport function sane(_x: TemplateStringsArray) {\n  // eslint-disable-next-line prefer-rest-params,prefer-spread\n  const str = String.raw.apply(String, arguments as any);\n\n  const match = /^\\n+( *)/m.exec(str);\n  if (!match) throw new Error('sane string must start with a \\\\n is:' + str);\n  const spaces = match[1]!.length;\n\n  let lines = str.split('\\n');\n  lines.shift(); // Remove the first empty lines\n  lines = lines.map(line => line.slice(spaces)); // Remove indentation\n  if (lines[lines.length - 1] === '') lines.pop(); // Remove last line if empty\n\n  return lines\n    .join('\\n')\n    .replace(/\\\\`/g, '`') // Fix \\` that should be `\n    .replace(/\\\\\\{/g, '{') // Fix \\{ that should be {\n    .replace(/\\\\\\\\/g, '\\\\'); // Fix \\\\ that should be \\\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const SPACE = ' ';\n\nexport const NEWLINE = '\\n';\nexport const INDENT = '  ';\nexport const NEWLINE_INDENT = NEWLINE + INDENT;\n\nexport function indentLines(str: string): string {\n  return str\n    .split(NEWLINE)\n    .map(l => INDENT + l)\n    .join(NEWLINE);\n}\n\nexport function trimString(str: string, maxLength: number): string {\n  if (str.length < maxLength) return str;\n  return str.substr(0, Math.max(maxLength - 3, 1)) + '...';\n}\n\nexport function clampIndex(index: number, min: number, max: number): number {\n  return Math.max(min, Math.min(max, Math.floor(index)));\n}\n\nexport function normalizeIndex(index: number, n: number): number {\n  return index < 0 ? index + n : index;\n}\n\nexport function insert<T>(array: readonly T[], index: number, value: T): T[] {\n  const n = array.length;\n  if (index < 0 || n < index) throw new Error(`insert index out of bounds (${index})`);\n  return array.slice(0, index).concat([value], array.slice(index, n));\n}\n\nconst ESCAPED =\n  // eslint-disable-next-line no-control-regex,no-misleading-character-class\n  /[\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\nexport function getEscapedRegExp() {\n  ESCAPED.lastIndex = 0; // Reset the search index before every use.\n  return ESCAPED;\n}\n\nexport function needsUnicodeEscape(str: string): boolean {\n  return getEscapedRegExp().test(str);\n}\n\nexport function sqlEscapeUnicode(str: string): string {\n  return str\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(getEscapedRegExp(), a => `\\\\${('0000' + a.charCodeAt(0).toString(16)).slice(-4)}`);\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const ALLOWED_FUNCTIONS = [\n  'ABS',\n  'ALL',\n  'ARRAY',\n  'AVG',\n  'CARDINALITY',\n  'CAST',\n  'CEIL',\n  'CEILING',\n  'CHAR',\n  'CHARACTER_LENGTH',\n  'CHAR_LENGTH',\n  'CLASSIFIER',\n  'COALESCE',\n  'COLLECT',\n  'CONVERT',\n  'COUNT',\n  'COVAR_POP',\n  'COVAR_SAMP',\n  'CUME_DIST',\n  'CURSOR',\n  'DATE',\n  'DENSE_RANK',\n  'DISTINCT',\n  'ELEMENT',\n  'EVERY',\n  'EXISTS',\n  'EXP',\n  'EXTRACT',\n  'FIRST_VALUE',\n  'FLOOR',\n  'FUSION',\n  'GROUPING',\n  'HOUR',\n  'INTERSECTION',\n  'INTERVAL',\n  'JSON_ARRAY',\n  'JSON_ARRAYAGG',\n  'JSON_EXISTS',\n  'JSON_OBJECT',\n  'JSON_OBJECTAGG',\n  'JSON_QUERY',\n  'JSON_VALUE',\n  'LAG',\n  'LAST_VALUE',\n  'LEAD',\n  'LEFT',\n  'LN',\n  'LOCAL',\n  'LOCALTIME',\n  'LOCALTIMESTAMP',\n  'LOWER',\n  'MATCH_NUMBER',\n  'MAX',\n  'MIN',\n  'MINUTE',\n  'MOD',\n  'MONTH',\n  'MULTISET',\n  'NEXT',\n  'NOT',\n  'NTH_VALUE',\n  'NTILE',\n  'NULLIF',\n  'OCTET_LENGTH',\n  'OVERLAY',\n  'PERCENTILE_CONT',\n  'PERCENTILE_DISC',\n  'PERCENT_RANK',\n  'PERIOD',\n  'POSITION',\n  'POWER',\n  'PREV',\n  'RANK',\n  'REGR_COUNT',\n  'REGR_SXX',\n  'REGR_SYY',\n  'RIGHT',\n  'ROW',\n  'ROW_NUMBER',\n  'SECOND',\n  'SOME',\n  'SQRT',\n  'STDDEV_POP',\n  'STDDEV_SAMP',\n  'STREAM',\n  'SUBSTRING',\n  'SUM',\n  'TABLE',\n  'TIME',\n  'TIMESTAMP',\n  'TRANSLATE',\n  'TRIM',\n  'TRUNCATE',\n  'UNIQUE',\n  'UNNEST',\n  'UPPER',\n  'USER',\n  'VAR_POP',\n  'VAR_SAMP',\n  'YEAR',\n];\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const RESERVED_KEYWORDS = [\n  'ABS',\n  'ALL',\n  'ALLOCATE',\n  'ALLOW',\n  'ALTER',\n  'AND',\n  'ANY',\n  'ARE',\n  'ARRAY',\n  'ARRAY_MAX_CARDINALITY',\n  'AS',\n  'ASENSITIVE',\n  'ASYMMETRIC',\n  'AT',\n  'ATOMIC',\n  'AUTHORIZATION',\n  'AVG',\n  'BEGIN',\n  'BEGIN_FRAME',\n  'BEGIN_PARTITION',\n  'BETWEEN',\n  'BIGINT',\n  'BINARY',\n  'BIT',\n  'BLOB',\n  'BOOLEAN',\n  'BOTH',\n  'BY',\n  'CALL',\n  'CALLED',\n  'CARDINALITY',\n  'CASCADED',\n  'CASE',\n  'CAST',\n  'CEIL',\n  'CEILING',\n  'CHAR',\n  'CHARACTER',\n  'CHARACTER_LENGTH',\n  'CHAR_LENGTH',\n  'CHECK',\n  'CLASSIFIER',\n  'CLOB',\n  'CLOSE',\n  'CLUSTERED',\n  'COALESCE',\n  'COLLATE',\n  'COLLECT',\n  'COLUMN',\n  'COMMIT',\n  'CONDITION',\n  'CONNECT',\n  'CONSTRAINT',\n  'CONTAINS',\n  'CONVERT',\n  'CORR',\n  'CORRESPONDING',\n  'COUNT',\n  'COVAR_POP',\n  'COVAR_SAMP',\n  'CREATE',\n  'CROSS',\n  'CUBE',\n  'CUME_DIST',\n  'CURRENT',\n  'CURRENT_DATE',\n  'CURRENT_ROW',\n  'CURRENT_TIME',\n  'CURRENT_TIMESTAMP',\n  'CURRENT_TRANSFORM_GROUP_FOR_TYPE',\n  'CURSOR',\n  'CYCLE',\n  'DATE',\n  'DAY',\n  'DEALLOCATE',\n  'DEC',\n  'DECIMAL',\n  'DECLARE',\n  'DEFAULT',\n  'DEFINE',\n  'DELETE',\n  'DENSE_RANK',\n  'DEREF',\n  'DESCRIBE',\n  'DETERMINISTIC',\n  'DISALLOW',\n  'DISCONNECT',\n  'DISTINCT',\n  'DOUBLE',\n  'DROP',\n  'DYNAMIC',\n  'EACH',\n  'ELEMENT',\n  'ELSE',\n  'EMPTY',\n  'END',\n  'END_FRAME',\n  'END_PARTITION',\n  'EQUALS',\n  'ESCAPE',\n  'EVERY',\n  'EXCEPT',\n  'EXEC',\n  'EXECUTE',\n  'EXISTS',\n  'EXP',\n  'EXPLAIN',\n  'EXTEND',\n  'EXTERNAL',\n  'EXTRACT',\n  'FALSE',\n  'FETCH',\n  'FILTER',\n  'FIRST_VALUE',\n  'FLOAT',\n  'FLOOR',\n  'FOR',\n  'FOREIGN',\n  'FRAME_ROW',\n  'FREE',\n  'FROM',\n  'FULL',\n  'FUNCTION',\n  'FUSION',\n  'GET',\n  'GLOBAL',\n  'GRANT',\n  'GROUP',\n  'GROUPING',\n  'GROUPS',\n  'HAVING',\n  'HOLD',\n  'HOUR',\n  'IDENTITY',\n  'IMPORT',\n  'IN',\n  'INDICATOR',\n  'INITIAL',\n  'INNER',\n  'INOUT',\n  'INSENSITIVE',\n  'INSERT',\n  'INT',\n  'INTEGER',\n  'INTERSECT',\n  'INTERSECTION',\n  'INTERVAL',\n  'INTO',\n  'IS',\n  'JOIN',\n  'JSON_ARRAY',\n  'JSON_ARRAYAGG',\n  'JSON_EXISTS',\n  'JSON_OBJECT',\n  'JSON_OBJECTAGG',\n  'JSON_QUERY',\n  'JSON_VALUE',\n  'LAG',\n  'LANGUAGE',\n  'LARGE',\n  'LAST_VALUE',\n  'LATERAL',\n  'LEAD',\n  'LEADING',\n  'LEFT',\n  'LIKE',\n  'LIKE_REGEX',\n  'LIMIT',\n  'LN',\n  'LOCAL',\n  'LOCALTIME',\n  'LOCALTIMESTAMP',\n  'LOWER',\n  'MATCH',\n  'MATCHES',\n  'MATCH_NUMBER',\n  'MATCH_RECOGNIZE',\n  'MAX',\n  'MEASURES',\n  'MEMBER',\n  'MERGE',\n  'METHOD',\n  'MIN',\n  'MINUS',\n  'MINUTE',\n  'MOD',\n  'MODIFIES',\n  'MODULE',\n  'MONTH',\n  'MULTISET',\n  'NATIONAL',\n  'NATURAL',\n  'NCHAR',\n  'NCLOB',\n  'NEW',\n  'NEXT',\n  'NO',\n  'NONE',\n  'NORMALIZE',\n  'NOT',\n  'NTH_VALUE',\n  'NTILE',\n  'NULL',\n  'NULLIF',\n  'NUMERIC',\n  'OCCURRENCES_REGEX',\n  'OCTET_LENGTH',\n  'OF',\n  'OFFSET',\n  'OLD',\n  'OMIT',\n  'ON',\n  'ONE',\n  'ONLY',\n  'OPEN',\n  'OR',\n  'ORDER',\n  'OUT',\n  'OUTER',\n  'OVER',\n  'OVERLAPS',\n  'OVERLAY',\n  'PARAMETER',\n  'PARTITION',\n  'PARTITIONED',\n  'PATTERN',\n  'PER',\n  'PERCENT',\n  'PERCENTILE_CONT',\n  'PERCENTILE_DISC',\n  'PERCENT_RANK',\n  'PERIOD',\n  'PERMUTE',\n  'PORTION',\n  'POSITION',\n  'POSITION_REGEX',\n  'POWER',\n  'PRECEDES',\n  'PRECISION',\n  'PREPARE',\n  'PREV',\n  'PRIMARY',\n  'PROCEDURE',\n  'RANGE',\n  'RANK',\n  'READS',\n  'REAL',\n  'RECURSIVE',\n  'REF',\n  'REFERENCES',\n  'REFERENCING',\n  'REGR_AVGX',\n  'REGR_AVGY',\n  'REGR_COUNT',\n  'REGR_INTERCEPT',\n  'REGR_SLOPE',\n  'REGR_SXX',\n  'REGR_SXY',\n  'REGR_SYY',\n  'RELEASE',\n  'RESET',\n  'RESULT',\n  'RETURN',\n  'RETURNS',\n  'REVOKE',\n  'RIGHT',\n  'ROLLBACK',\n  'ROLLUP',\n  'ROW',\n  'ROWS',\n  'ROW_NUMBER',\n  'RUNNING',\n  'SAVEPOINT',\n  'SCOPE',\n  'SCROLL',\n  'SEARCH',\n  'SECOND',\n  'SEEK',\n  'SELECT',\n  'SENSITIVE',\n  'SET',\n  'SHOW',\n  'SIMILAR',\n  'SKIP',\n  'SMALLINT',\n  'SOME',\n  'SPECIFIC',\n  'SPECIFICTYPE',\n  'SQL',\n  'SQLEXCEPTION',\n  'SQLSTATE',\n  'SQLWARNING',\n  'SQRT',\n  'START',\n  'STATIC',\n  'STDDEV_POP',\n  'STDDEV_SAMP',\n  'STREAM',\n  'SUBMULTISET',\n  'SUBSET',\n  'SUBSTRING',\n  'SUBSTRING_REGEX',\n  'SUCCEEDS',\n  'SUM',\n  'SYMMETRIC',\n  'SYSTEM',\n  'SYSTEM_TIME',\n  'TABLE',\n  'TABLESAMPLE',\n  'THEN',\n  'TIME',\n  'TIMESTAMP',\n  'TIMEZONE_HOUR',\n  'TIMEZONE_MINUTE',\n  'TINYINT',\n  'TO',\n  'TRAILING',\n  'TRANSLATE',\n  'TRANSLATE_REGEX',\n  'TRANSLATION',\n  'TREAT',\n  'TRIGGER',\n  'TRIM',\n  'TRIM_ARRAY',\n  'TRUE',\n  'TRUNCATE',\n  'UESCAPE',\n  'UNION',\n  'UNIQUE',\n  'UNKNOWN',\n  'UNNEST',\n  'UPDATE',\n  'UPPER',\n  'UPSERT',\n  'USING',\n  'VALUE',\n  'VALUES',\n  'VALUE_OF',\n  'VARBINARY',\n  'VARCHAR',\n  'VARYING',\n  'VAR_POP',\n  'VAR_SAMP',\n  'VERSIONING',\n  'WHEN',\n  'WHENEVER',\n  'WHERE',\n  'WIDTH_BUCKET',\n  'WINDOW',\n  'WITH',\n  'WITHIN',\n  'WITHOUT',\n  'YEAR',\n];\n\nexport const RESERVED_ALIASES = [\n  'CURRENT_CATALOG',\n  'CURRENT_DEFAULT_TRANSFORM_GROUP',\n  'CURRENT_PATH',\n  'CURRENT_ROLE',\n  'CURRENT_SCHEMA',\n  'CURRENT_USER',\n  'SESSION_USER',\n  'SYSTEM_USER',\n  'USER',\n];\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ALLOWED_FUNCTIONS } from '../../allowed-functions';\nimport { RESERVED_ALIASES, RESERVED_KEYWORDS } from '../../reserved-keywords';\nimport { needsUnicodeEscape, sqlEscapeUnicode, trimString } from '../general/general';\n\nconst VALID_NAKED_NAME_REGEXP = /^[a-z_]\\w*$/i;\n\nconst reservedKeywordLookup: Record<string, boolean> = {};\nfor (const r of RESERVED_KEYWORDS) {\n  reservedKeywordLookup[r] = true;\n}\n\nconst reservedAliasLookup: Record<string, boolean> = {};\nfor (const r of RESERVED_ALIASES) {\n  reservedAliasLookup[r] = true;\n}\n\nconst allowedFunctionLookup: Record<string, boolean> = {};\nfor (const r of ALLOWED_FUNCTIONS) {\n  allowedFunctionLookup[r] = true;\n}\n\nexport interface RefNameValue {\n  name: string;\n  quotes: boolean;\n}\n\nexport class RefName {\n  static RESERVED_KEYWORDS = RESERVED_KEYWORDS;\n  static RESERVED_ALIASES = RESERVED_ALIASES;\n  static ALLOWED_FUNCTIONS = ALLOWED_FUNCTIONS;\n\n  static isReservedKeyword(k: string) {\n    return Boolean(reservedKeywordLookup[k.toUpperCase()]);\n  }\n\n  static isReservedAlias(k: string) {\n    return RefName.isReservedKeyword(k) || Boolean(reservedAliasLookup[k.toUpperCase()]);\n  }\n\n  static isReservedFunctionName(k: string) {\n    return RefName.isReservedKeyword(k) && !allowedFunctionLookup[k.toUpperCase()];\n  }\n\n  static needsQuotes(name: string): boolean {\n    return !VALID_NAKED_NAME_REGEXP.test(name) || RefName.isReservedKeyword(name);\n  }\n\n  static needsQuotesAlias(name: string): boolean {\n    return !VALID_NAKED_NAME_REGEXP.test(name) || RefName.isReservedAlias(name);\n  }\n\n  static needsQuotesFunctionName(name: string): boolean {\n    return !VALID_NAKED_NAME_REGEXP.test(name) || RefName.isReservedFunctionName(name);\n  }\n\n  static maybe(name: string | undefined, forceQuotes = true): RefName | undefined {\n    if (!name) return;\n    return RefName.create(name, forceQuotes);\n  }\n\n  static create(name: string | RefName, forceQuotes = true): RefName {\n    if (name instanceof RefName) return name;\n    return new RefName({ name, quotes: forceQuotes || RefName.needsQuotes(name) });\n  }\n\n  static alias(name: string | RefName, forceQuotes = true): RefName {\n    if (name instanceof RefName) return name;\n    return new RefName({ name, quotes: forceQuotes || RefName.needsQuotesAlias(name) });\n  }\n\n  static functionName(name: string | RefName, forceQuotes = false): RefName {\n    if (name instanceof RefName) return name;\n    return new RefName({ name, quotes: forceQuotes || RefName.needsQuotesFunctionName(name) });\n  }\n\n  public readonly name: string;\n  public readonly quotes: boolean;\n\n  constructor(options: RefNameValue) {\n    this.name = options.name;\n    this.quotes = options.quotes;\n  }\n\n  public valueOf(): RefNameValue {\n    return {\n      name: this.name,\n      quotes: this.quotes,\n    };\n  }\n\n  public toString(): string {\n    const { name, quotes } = this;\n    if (!quotes) return name;\n\n    const quoteEscapedName = name.replace(/\"/g, '\"\"');\n    if (needsUnicodeEscape(quoteEscapedName)) {\n      return `U&\"${sqlEscapeUnicode(quoteEscapedName)}\"`;\n    } else {\n      return `\"${quoteEscapedName}\"`;\n    }\n  }\n\n  public changeName(name: string): RefName {\n    return RefName.create(name, this.quotes);\n  }\n\n  public changeNameAsAlias(name: string): RefName {\n    return RefName.alias(name, this.quotes);\n  }\n\n  public changeNameAsFunctionName(name: string): RefName {\n    return RefName.functionName(name, this.quotes);\n  }\n\n  public prettyTrim(maxLength: number): RefName {\n    return this.changeName(trimString(this.name, maxLength));\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEmptyArray } from '../../../utils';\nimport { clampIndex, insert, normalizeIndex, Separator } from '..';\n\nexport type SeparatorOrString = Separator | string;\n\nexport class SeparatedArray<T> {\n  static fromArray<T>(\n    xs: readonly T[] | SeparatedArray<T>,\n    separator?: SeparatorOrString,\n  ): SeparatedArray<T> {\n    if (xs instanceof SeparatedArray) return xs;\n    const separators: SeparatorOrString[] = [];\n    if (separator) {\n      for (let i = 1; i < xs.length; i++) {\n        separators.push(separator);\n      }\n    }\n    return new SeparatedArray<T>(xs, separators);\n  }\n\n  static fromPossiblyEmptyArray<T>(\n    xs: readonly T[] | SeparatedArray<T> | undefined,\n    separator?: SeparatorOrString,\n  ): SeparatedArray<T> | undefined {\n    if (!xs || isEmptyArray(xs)) return;\n    return SeparatedArray.fromArray(xs, separator);\n  }\n\n  static fromSingleValue<T>(x: T): SeparatedArray<T> {\n    return new SeparatedArray<T>([x], []);\n  }\n\n  static fromTwoValuesWithSeparator<T>(\n    value0: T,\n    separator: SeparatorOrString,\n    value1: T,\n  ): SeparatedArray<T> {\n    return new SeparatedArray<T>([value0, value1], [separator]);\n  }\n\n  public readonly values: readonly T[];\n  public readonly separators: (SeparatorOrString | undefined)[];\n\n  constructor(values: readonly T[], separators?: (SeparatorOrString | undefined)[]) {\n    separators = separators || [];\n    if (!values.length) {\n      throw new Error('must have at least one value');\n    }\n    if (values.length <= separators.length) {\n      throw new Error(\n        `invalid values (${values.length}) or separator length (${separators.length})`,\n      );\n    }\n\n    this.values = values;\n    this.separators = separators;\n  }\n\n  public toString(defaultSeparator: SeparatorOrString = Separator.COMMA): string {\n    const { values, separators } = this;\n    const lastIndex = values.length - 1;\n    return values\n      .map((v, i) => String(v) + (i < lastIndex ? String(separators[i] ?? defaultSeparator) : ''))\n      .join('');\n  }\n\n  public length(): number {\n    return this.values.length;\n  }\n\n  public get(index: number): T | undefined {\n    return this.values[normalizeIndex(index, this.values.length)];\n  }\n\n  public first(): T {\n    return this.values[0]!;\n  }\n\n  public change(index: number, newValue: T): SeparatedArray<T> {\n    index = normalizeIndex(index, this.values.length);\n    return this.map((value, i) => (i === index ? newValue : value));\n  }\n\n  public map<U>(fn: (value: T, index: number) => U): SeparatedArray<U> {\n    return new SeparatedArray<U>(this.values.map(fn), this.separators);\n  }\n\n  public filter(fn: (value: T, index: number) => any): SeparatedArray<T> | undefined {\n    const { values, separators } = this;\n    const filteredValues: T[] = [];\n    const filteredSeparators: (SeparatorOrString | undefined)[] = [];\n    let skippedFirst = false;\n    for (let i = 0; i < values.length; i++) {\n      const value = values[i]!;\n      if (fn(value, i)) {\n        filteredValues.push(value);\n        if (i > 0) filteredSeparators.push(separators[i - 1]);\n      } else if (i === 0) {\n        skippedFirst = true;\n      }\n    }\n\n    // Remove the first separator because we skipped the first element\n    if (skippedFirst && filteredSeparators.length) {\n      filteredSeparators.shift();\n    }\n\n    if (!filteredValues.length) return;\n    return new SeparatedArray<T>(filteredValues, filteredSeparators);\n  }\n\n  public filterMap<U>(\n    callbackfn: (value: T, index: number) => U | undefined,\n  ): SeparatedArray<U> | undefined {\n    // Technically the intermediate array here will not be valid because it might have an `undefined` in it which is not walkable\n    return this.map(callbackfn as any).filter(Boolean) as SeparatedArray<U> | undefined;\n  }\n\n  public remove(index: number): SeparatedArray<T> | undefined {\n    if (index < 0) index += this.values.length;\n    return this.filter((_x, i) => i !== index);\n  }\n\n  public insert(index: number, value: T): SeparatedArray<T> {\n    const { values, separators } = this;\n    index = clampIndex(normalizeIndex(index, values.length), 0, values.length);\n\n    const sn = separators.length;\n    const separator = separators[clampIndex(index - 1, 0, sn - 1)];\n    return new SeparatedArray<T>(\n      insert(values, index, value),\n      insert(separators, Math.min(index, sn), separator),\n    );\n  }\n\n  public prepend(value: T): SeparatedArray<T> {\n    return this.insert(0, value);\n  }\n\n  public append(value: T): SeparatedArray<T> {\n    return this.insert(Infinity, value);\n  }\n\n  public clearSeparators(): SeparatedArray<T> {\n    return new SeparatedArray<T>(this.values, []);\n  }\n\n  public clearSeparatorsMatching(match: string): SeparatedArray<T> {\n    let hasUnmatched = false;\n    const newSeparators: (SeparatorOrString | undefined)[] = this.separators.map(separator => {\n      if (\n        (typeof separator === 'string' && separator === match) ||\n        (separator instanceof Separator && separator.separator === match)\n      ) {\n        return;\n      } else {\n        hasUnmatched = true;\n        return separator;\n      }\n    });\n    return new SeparatedArray<T>(this.values, hasUnmatched ? newSeparators : []);\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE, NEWLINE_INDENT, SPACE } from '../general/general';\n\nexport interface SeparatorValue {\n  left?: string;\n  right?: string;\n  separator: string;\n}\n\nexport class Separator {\n  public left?: string;\n  public right?: string;\n  public separator: string;\n\n  static COMMA: Separator;\n  static COMMA_NEWLINE: Separator;\n\n  static symmetricSpace(separator: string) {\n    return new Separator({ left: SPACE, separator: separator, right: SPACE });\n  }\n\n  static rightSpace(separator: string) {\n    return new Separator({ separator: separator, right: SPACE });\n  }\n\n  static indentSpace(separator: string) {\n    return new Separator({ left: SPACE, separator: separator, right: NEWLINE_INDENT });\n  }\n\n  static newlineFirst(separator: string) {\n    return new Separator({ left: NEWLINE_INDENT, separator: separator, right: SPACE });\n  }\n\n  constructor(options: SeparatorValue) {\n    this.left = options.left || '';\n    this.right = options.right || '';\n    this.separator = options.separator;\n  }\n\n  public toString(): string {\n    return [this.left, this.separator, this.right].join('');\n  }\n}\n\nSeparator.COMMA = Separator.rightSpace(',');\nSeparator.COMMA_NEWLINE = new Separator({ separator: ',', right: NEWLINE });\n","\n/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable */\n\nimport * as S from '..';\n\n/* eslint-disable */\n\n\n\nconst peggyParser: {parse: any, SyntaxError: any, DefaultTracer?: any} = // Generated by Peggy 3.0.2.\n//\n// https://peggyjs.org/\n// @ts-ignore\n(function() {\n// @ts-ignore\n  \"use strict\";\n\n// @ts-ignore\nfunction peg$subclass(child, parent) {\n// @ts-ignore\n  function C() { this.constructor = child; }\n// @ts-ignore\n  C.prototype = parent.prototype;\n// @ts-ignore\n  child.prototype = new C();\n}\n\n// @ts-ignore\nfunction peg$SyntaxError(message, expected, found, location) {\n// @ts-ignore\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n// @ts-ignore\n  if (Object.setPrototypeOf) {\n// @ts-ignore\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n// @ts-ignore\n  self.expected = expected;\n// @ts-ignore\n  self.found = found;\n// @ts-ignore\n  self.location = location;\n// @ts-ignore\n  self.name = \"SyntaxError\";\n// @ts-ignore\n  return self;\n}\n\n// @ts-ignore\npeg$subclass(peg$SyntaxError, Error);\n\n// @ts-ignore\nfunction peg$padEnd(str, targetLength, padString) {\n// @ts-ignore\n  padString = padString || \" \";\n// @ts-ignore\n  if (str.length > targetLength) { return str; }\n// @ts-ignore\n  targetLength -= str.length;\n// @ts-ignore\n  padString += padString.repeat(targetLength);\n// @ts-ignore\n  return str + padString.slice(0, targetLength);\n}\n\n// @ts-ignore\npeg$SyntaxError.prototype.format = function(sources) {\n// @ts-ignore\n  var str = \"Error: \" + this.message;\n// @ts-ignore\n  if (this.location) {\n// @ts-ignore\n    var src = null;\n// @ts-ignore\n    var k;\n// @ts-ignore\n    for (k = 0; k < sources.length; k++) {\n// @ts-ignore\n      if (sources[k].source === this.location.source) {\n// @ts-ignore\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n// @ts-ignore\n        break;\n      }\n    }\n// @ts-ignore\n    var s = this.location.start;\n// @ts-ignore\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n// @ts-ignore\n      ? this.location.source.offset(s)\n// @ts-ignore\n      : s;\n// @ts-ignore\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n// @ts-ignore\n    if (src) {\n// @ts-ignore\n      var e = this.location.end;\n// @ts-ignore\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n// @ts-ignore\n      var line = src[s.line - 1];\n// @ts-ignore\n      var last = s.line === e.line ? e.column : line.length + 1;\n// @ts-ignore\n      var hatLen = (last - s.column) || 1;\n// @ts-ignore\n      str += \"\\n --> \" + loc + \"\\n\"\n// @ts-ignore\n          + filler + \" |\\n\"\n// @ts-ignore\n          + offset_s.line + \" | \" + line + \"\\n\"\n// @ts-ignore\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n// @ts-ignore\n          + peg$padEnd(\"\", hatLen, \"^\");\n// @ts-ignore\n    } else {\n// @ts-ignore\n      str += \"\\n at \" + loc;\n    }\n  }\n// @ts-ignore\n  return str;\n};\n\n// @ts-ignore\npeg$SyntaxError.buildMessage = function(expected, found) {\n// @ts-ignore\n  var DESCRIBE_EXPECTATION_FNS = {\n// @ts-ignore\n    literal: function(expectation) {\n// @ts-ignore\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n// @ts-ignore\n    class: function(expectation) {\n// @ts-ignore\n      var escapedParts = expectation.parts.map(function(part) {\n// @ts-ignore\n        return Array.isArray(part)\n// @ts-ignore\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n// @ts-ignore\n          : classEscape(part);\n      });\n\n// @ts-ignore\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n// @ts-ignore\n    any: function() {\n// @ts-ignore\n      return \"any character\";\n    },\n\n// @ts-ignore\n    end: function() {\n// @ts-ignore\n      return \"end of input\";\n    },\n\n// @ts-ignore\n    other: function(expectation) {\n// @ts-ignore\n      return expectation.description;\n    }\n  };\n\n// @ts-ignore\n  function hex(ch) {\n// @ts-ignore\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n// @ts-ignore\n  function literalEscape(s) {\n// @ts-ignore\n    return s\n// @ts-ignore\n      .replace(/\\\\/g, \"\\\\\\\\\")\n// @ts-ignore\n      .replace(/\"/g,  \"\\\\\\\"\")\n// @ts-ignore\n      .replace(/\\0/g, \"\\\\0\")\n// @ts-ignore\n      .replace(/\\t/g, \"\\\\t\")\n// @ts-ignore\n      .replace(/\\n/g, \"\\\\n\")\n// @ts-ignore\n      .replace(/\\r/g, \"\\\\r\")\n// @ts-ignore\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n// @ts-ignore\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n// @ts-ignore\n  function classEscape(s) {\n// @ts-ignore\n    return s\n// @ts-ignore\n      .replace(/\\\\/g, \"\\\\\\\\\")\n// @ts-ignore\n      .replace(/\\]/g, \"\\\\]\")\n// @ts-ignore\n      .replace(/\\^/g, \"\\\\^\")\n// @ts-ignore\n      .replace(/-/g,  \"\\\\-\")\n// @ts-ignore\n      .replace(/\\0/g, \"\\\\0\")\n// @ts-ignore\n      .replace(/\\t/g, \"\\\\t\")\n// @ts-ignore\n      .replace(/\\n/g, \"\\\\n\")\n// @ts-ignore\n      .replace(/\\r/g, \"\\\\r\")\n// @ts-ignore\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n// @ts-ignore\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n// @ts-ignore\n  function describeExpectation(expectation) {\n// @ts-ignore\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n// @ts-ignore\n  function describeExpected(expected) {\n// @ts-ignore\n    var descriptions = expected.map(describeExpectation);\n// @ts-ignore\n    var i, j;\n\n// @ts-ignore\n    descriptions.sort();\n\n// @ts-ignore\n    if (descriptions.length > 0) {\n// @ts-ignore\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n// @ts-ignore\n        if (descriptions[i - 1] !== descriptions[i]) {\n// @ts-ignore\n          descriptions[j] = descriptions[i];\n// @ts-ignore\n          j++;\n        }\n      }\n// @ts-ignore\n      descriptions.length = j;\n    }\n\n// @ts-ignore\n    switch (descriptions.length) {\n// @ts-ignore\n      case 1:\n// @ts-ignore\n        return descriptions[0];\n\n// @ts-ignore\n      case 2:\n// @ts-ignore\n        return descriptions[0] + \" or \" + descriptions[1];\n\n// @ts-ignore\n      default:\n// @ts-ignore\n        return descriptions.slice(0, -1).join(\", \")\n// @ts-ignore\n          + \", or \"\n// @ts-ignore\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n// @ts-ignore\n  function describeFound(found) {\n// @ts-ignore\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n// @ts-ignore\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\n// @ts-ignore\nfunction peg$parse(input, options) {\n// @ts-ignore\n  options = options !== undefined ? options : {};\n\n// @ts-ignore\n  var peg$FAILED = {};\n// @ts-ignore\n  var peg$source = options.grammarSource;\n\n// @ts-ignore\n  var peg$startRuleFunctions = { Start: peg$parseStart, StartSetStatementsOnly: peg$parseStartSetStatementsOnly };\n// @ts-ignore\n  var peg$startRuleFunction = peg$parseStart;\n\n// @ts-ignore\n  var peg$c0 = \"=>\";\n  var peg$c1 = \":\";\n  var peg$c2 = \"=\";\n  var peg$c3 = \";\";\n  var peg$c4 = \"left\";\n  var peg$c5 = \"right\";\n  var peg$c6 = \"full\";\n  var peg$c7 = \"inner\";\n  var peg$c8 = \"cross\";\n  var peg$c9 = \"<>\";\n  var peg$c10 = \"!=\";\n  var peg$c11 = \">=\";\n  var peg$c12 = \"<=\";\n  var peg$c13 = \"<\";\n  var peg$c14 = \">\";\n  var peg$c15 = \"+\";\n  var peg$c16 = \"-\";\n  var peg$c17 = \"*\";\n  var peg$c18 = \"/\";\n  var peg$c19 = \"||\";\n  var peg$c20 = \"_\";\n  var peg$c21 = \"s\";\n  var peg$c22 = \"second\";\n  var peg$c23 = \"minute\";\n  var peg$c24 = \"hour\";\n  var peg$c25 = \"day\";\n  var peg$c26 = \"week\";\n  var peg$c27 = \"month\";\n  var peg$c28 = \"quarter\";\n  var peg$c29 = \"year\";\n  var peg$c30 = \"epoch\";\n  var peg$c31 = \"microsecond\";\n  var peg$c32 = \"millisecond\";\n  var peg$c33 = \"dow\";\n  var peg$c34 = \"isodow\";\n  var peg$c35 = \"doy\";\n  var peg$c36 = \"isoyear\";\n  var peg$c37 = \"decade\";\n  var peg$c38 = \"century\";\n  var peg$c39 = \"millennium\";\n  var peg$c40 = \".\";\n  var peg$c41 = \"\\\"\";\n  var peg$c42 = \"[\";\n  var peg$c43 = \"]\";\n  var peg$c44 = \",\";\n  var peg$c45 = \"?\";\n  var peg$c46 = \"e\";\n  var peg$c47 = \"'\";\n  var peg$c48 = \"''\";\n  var peg$c49 = \"u&\";\n  var peg$c50 = \"x'\";\n  var peg$c51 = \"\\\"\\\"\";\n  var peg$c52 = \"--\";\n  var peg$c53 = \"/*\";\n  var peg$c54 = \"*/\";\n  var peg$c55 = \"(\";\n  var peg$c56 = \")\";\n  var peg$c57 = \"all\";\n  var peg$c58 = \"and\";\n  var peg$c59 = \"any\";\n  var peg$c60 = \"array\";\n  var peg$c61 = \"as\";\n  var peg$c62 = \"asc\";\n  var peg$c63 = \"between\";\n  var peg$c64 = \"both\";\n  var peg$c65 = \"case\";\n  var peg$c66 = \"cast\";\n  var peg$c67 = \"ceil\";\n  var peg$c68 = \"clustered\";\n  var peg$c69 = \"by\";\n  var peg$c70 = \"count\";\n  var peg$c71 = \"csv\";\n  var peg$c72 = \"current\";\n  var peg$c73 = \"row\";\n  var peg$c74 = \"cube\";\n  var peg$c75 = \"date\";\n  var peg$c76 = \"desc\";\n  var peg$c77 = \"distinct\";\n  var peg$c78 = \"else\";\n  var peg$c79 = \"end\";\n  var peg$c80 = \"escape\";\n  var peg$c81 = \"explain\";\n  var peg$c82 = \"plan\";\n  var peg$c83 = \"for\";\n  var peg$c84 = \"extend\";\n  var peg$c85 = \"extract\";\n  var peg$c86 = \"false\";\n  var peg$c87 = \"filter\";\n  var peg$c88 = \"floor\";\n  var peg$c89 = \"following\";\n  var peg$c90 = \"from\";\n  var peg$c91 = \"group\";\n  var peg$c92 = \"grouping\";\n  var peg$c93 = \"sets\";\n  var peg$c94 = \"having\";\n  var peg$c95 = \"in\";\n  var peg$c96 = \"insert\";\n  var peg$c97 = \"interval\";\n  var peg$c98 = \"into\";\n  var peg$c99 = \"is\";\n  var peg$c100 = \"join\";\n  var peg$c101 = \"json_value\";\n  var peg$c102 = \"json_object\";\n  var peg$c103 = \"key\";\n  var peg$c104 = \"value\";\n  var peg$c105 = \"leading\";\n  var peg$c106 = \"like\";\n  var peg$c107 = \"limit\";\n  var peg$c108 = \"natural\";\n  var peg$c109 = \"not\";\n  var peg$c110 = \"null\";\n  var peg$c111 = \"offset\";\n  var peg$c112 = \"on\";\n  var peg$c113 = \"or\";\n  var peg$c114 = \"order\";\n  var peg$c115 = \"outer\";\n  var peg$c116 = \"over\";\n  var peg$c117 = \"overwrite\";\n  var peg$c118 = \"partitioned\";\n  var peg$c119 = \"partition\";\n  var peg$c120 = \"position\";\n  var peg$c121 = \"preceding\";\n  var peg$c122 = \"range\";\n  var peg$c123 = \"replace\";\n  var peg$c124 = \"returning\";\n  var peg$c125 = \"rollup\";\n  var peg$c126 = \"rows\";\n  var peg$c127 = \"select\";\n  var peg$c128 = \"set\";\n  var peg$c129 = \"some\";\n  var peg$c130 = \"symmetric\";\n  var peg$c131 = \"table\";\n  var peg$c132 = \"then\";\n  var peg$c133 = \"time\";\n  var peg$c134 = \"timestamp\";\n  var peg$c135 = \"timestampadd\";\n  var peg$c136 = \"timestampdiff\";\n  var peg$c137 = \"to\";\n  var peg$c138 = \"trailing\";\n  var peg$c139 = \"trim\";\n  var peg$c140 = \"true\";\n  var peg$c141 = \"unbounded\";\n  var peg$c142 = \"union\";\n  var peg$c143 = \"using\";\n  var peg$c144 = \"values\";\n  var peg$c145 = \"when\";\n  var peg$c146 = \"where\";\n  var peg$c147 = \"with\";\n\n  var peg$r0 = /^[+\\-]/;\n  var peg$r1 = /^[0-9]/;\n  var peg$r2 = /^[^']/;\n  var peg$r3 = /^[a-z0-9]/i;\n  var peg$r4 = /^[a-z0-9_\\-]/i;\n  var peg$r5 = /^[0-9A-F]/i;\n  var peg$r6 = /^[^\"]/;\n  var peg$r7 = /^[a-z_]/i;\n  var peg$r8 = /^[a-z0-9_]/i;\n  var peg$r9 = /^[^\\n]/;\n  var peg$r10 = /^[\\n]/;\n  var peg$r11 = /^[ \\t\\n\\r]/;\n  var peg$r12 = /^[ \\t\\n\\r;]/;\n\n  var peg$e0 = peg$anyExpectation();\n  var peg$e1 = peg$literalExpectation(\"=>\", false);\n  var peg$e2 = peg$literalExpectation(\":\", false);\n  var peg$e3 = peg$literalExpectation(\"=\", false);\n  var peg$e4 = peg$literalExpectation(\";\", false);\n  var peg$e5 = peg$literalExpectation(\"LEFT\", true);\n  var peg$e6 = peg$literalExpectation(\"RIGHT\", true);\n  var peg$e7 = peg$literalExpectation(\"FULL\", true);\n  var peg$e8 = peg$literalExpectation(\"INNER\", true);\n  var peg$e9 = peg$literalExpectation(\"CROSS\", true);\n  var peg$e10 = peg$literalExpectation(\"<>\", false);\n  var peg$e11 = peg$literalExpectation(\"!=\", false);\n  var peg$e12 = peg$literalExpectation(\">=\", false);\n  var peg$e13 = peg$literalExpectation(\"<=\", false);\n  var peg$e14 = peg$literalExpectation(\"<\", false);\n  var peg$e15 = peg$literalExpectation(\">\", false);\n  var peg$e16 = peg$literalExpectation(\"+\", false);\n  var peg$e17 = peg$literalExpectation(\"-\", false);\n  var peg$e18 = peg$literalExpectation(\"*\", false);\n  var peg$e19 = peg$literalExpectation(\"/\", false);\n  var peg$e20 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e21 = peg$literalExpectation(\"||\", false);\n  var peg$e22 = peg$literalExpectation(\"_\", false);\n  var peg$e23 = peg$literalExpectation(\"S\", true);\n  var peg$e24 = peg$literalExpectation(\"SECOND\", true);\n  var peg$e25 = peg$literalExpectation(\"MINUTE\", true);\n  var peg$e26 = peg$literalExpectation(\"HOUR\", true);\n  var peg$e27 = peg$literalExpectation(\"DAY\", true);\n  var peg$e28 = peg$literalExpectation(\"WEEK\", true);\n  var peg$e29 = peg$literalExpectation(\"MONTH\", true);\n  var peg$e30 = peg$literalExpectation(\"QUARTER\", true);\n  var peg$e31 = peg$literalExpectation(\"YEAR\", true);\n  var peg$e32 = peg$literalExpectation(\"EPOCH\", true);\n  var peg$e33 = peg$literalExpectation(\"MICROSECOND\", true);\n  var peg$e34 = peg$literalExpectation(\"MILLISECOND\", true);\n  var peg$e35 = peg$literalExpectation(\"DOW\", true);\n  var peg$e36 = peg$literalExpectation(\"ISODOW\", true);\n  var peg$e37 = peg$literalExpectation(\"DOY\", true);\n  var peg$e38 = peg$literalExpectation(\"ISOYEAR\", true);\n  var peg$e39 = peg$literalExpectation(\"DECADE\", true);\n  var peg$e40 = peg$literalExpectation(\"CENTURY\", true);\n  var peg$e41 = peg$literalExpectation(\"MILLENNIUM\", true);\n  var peg$e42 = peg$literalExpectation(\".\", false);\n  var peg$e43 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e44 = peg$literalExpectation(\"[\", false);\n  var peg$e45 = peg$literalExpectation(\"]\", false);\n  var peg$e46 = peg$literalExpectation(\",\", false);\n  var peg$e47 = peg$literalExpectation(\"?\", false);\n  var peg$e48 = peg$otherExpectation(\"Number\");\n  var peg$e49 = peg$literalExpectation(\"e\", true);\n  var peg$e50 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e51 = peg$literalExpectation(\"'\", false);\n  var peg$e52 = peg$literalExpectation(\"''\", false);\n  var peg$e53 = peg$classExpectation([\"'\"], true, false);\n  var peg$e54 = peg$literalExpectation(\"U&\", true);\n  var peg$e55 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"]], false, true);\n  var peg$e56 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"-\"], false, true);\n  var peg$e57 = peg$literalExpectation(\"X'\", true);\n  var peg$e58 = peg$classExpectation([[\"0\", \"9\"], [\"A\", \"F\"]], false, true);\n  var peg$e59 = peg$literalExpectation(\"\\\"\\\"\", false);\n  var peg$e60 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e61 = peg$classExpectation([[\"a\", \"z\"], \"_\"], false, true);\n  var peg$e62 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, true);\n  var peg$e63 = peg$otherExpectation(\"optional whitespace\");\n  var peg$e64 = peg$otherExpectation(\"mandatory whitespace\");\n  var peg$e65 = peg$otherExpectation(\"pure whitespace\");\n  var peg$e66 = peg$otherExpectation(\"possible semicolon\");\n  var peg$e67 = peg$literalExpectation(\"--\", false);\n  var peg$e68 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e69 = peg$classExpectation([\"\\n\"], false, false);\n  var peg$e70 = peg$literalExpectation(\"/*\", false);\n  var peg$e71 = peg$literalExpectation(\"*/\", false);\n  var peg$e72 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\"], false, false);\n  var peg$e73 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\", \";\"], false, false);\n  var peg$e74 = peg$otherExpectation(\"(\");\n  var peg$e75 = peg$literalExpectation(\"(\", false);\n  var peg$e76 = peg$otherExpectation(\")\");\n  var peg$e77 = peg$literalExpectation(\")\", false);\n  var peg$e78 = peg$literalExpectation(\"ALL\", true);\n  var peg$e79 = peg$literalExpectation(\"AND\", true);\n  var peg$e80 = peg$literalExpectation(\"ANY\", true);\n  var peg$e81 = peg$literalExpectation(\"ARRAY\", true);\n  var peg$e82 = peg$literalExpectation(\"AS\", true);\n  var peg$e83 = peg$literalExpectation(\"ASC\", true);\n  var peg$e84 = peg$literalExpectation(\"BETWEEN\", true);\n  var peg$e85 = peg$literalExpectation(\"BOTH\", true);\n  var peg$e86 = peg$literalExpectation(\"CASE\", true);\n  var peg$e87 = peg$literalExpectation(\"CAST\", true);\n  var peg$e88 = peg$literalExpectation(\"CEIL\", true);\n  var peg$e89 = peg$literalExpectation(\"CLUSTERED\", true);\n  var peg$e90 = peg$literalExpectation(\"BY\", true);\n  var peg$e91 = peg$literalExpectation(\"COUNT\", true);\n  var peg$e92 = peg$literalExpectation(\"CSV\", true);\n  var peg$e93 = peg$literalExpectation(\"CURRENT\", true);\n  var peg$e94 = peg$literalExpectation(\"ROW\", true);\n  var peg$e95 = peg$literalExpectation(\"CUBE\", true);\n  var peg$e96 = peg$literalExpectation(\"DATE\", true);\n  var peg$e97 = peg$literalExpectation(\"DESC\", true);\n  var peg$e98 = peg$literalExpectation(\"DISTINCT\", true);\n  var peg$e99 = peg$literalExpectation(\"ELSE\", true);\n  var peg$e100 = peg$literalExpectation(\"END\", true);\n  var peg$e101 = peg$literalExpectation(\"ESCAPE\", true);\n  var peg$e102 = peg$literalExpectation(\"EXPLAIN\", true);\n  var peg$e103 = peg$literalExpectation(\"PLAN\", true);\n  var peg$e104 = peg$literalExpectation(\"FOR\", true);\n  var peg$e105 = peg$literalExpectation(\"EXTEND\", true);\n  var peg$e106 = peg$literalExpectation(\"EXTRACT\", true);\n  var peg$e107 = peg$literalExpectation(\"FALSE\", true);\n  var peg$e108 = peg$literalExpectation(\"FILTER\", true);\n  var peg$e109 = peg$literalExpectation(\"FLOOR\", true);\n  var peg$e110 = peg$literalExpectation(\"FOLLOWING\", true);\n  var peg$e111 = peg$literalExpectation(\"FROM\", true);\n  var peg$e112 = peg$literalExpectation(\"GROUP\", true);\n  var peg$e113 = peg$literalExpectation(\"GROUPING\", true);\n  var peg$e114 = peg$literalExpectation(\"SETS\", true);\n  var peg$e115 = peg$literalExpectation(\"HAVING\", true);\n  var peg$e116 = peg$literalExpectation(\"IN\", true);\n  var peg$e117 = peg$literalExpectation(\"INSERT\", true);\n  var peg$e118 = peg$literalExpectation(\"INTERVAL\", true);\n  var peg$e119 = peg$literalExpectation(\"INTO\", true);\n  var peg$e120 = peg$literalExpectation(\"IS\", true);\n  var peg$e121 = peg$literalExpectation(\"JOIN\", true);\n  var peg$e122 = peg$literalExpectation(\"JSON_VALUE\", true);\n  var peg$e123 = peg$literalExpectation(\"JSON_OBJECT\", true);\n  var peg$e124 = peg$literalExpectation(\"KEY\", true);\n  var peg$e125 = peg$literalExpectation(\"VALUE\", true);\n  var peg$e126 = peg$literalExpectation(\"LEADING\", true);\n  var peg$e127 = peg$literalExpectation(\"LIKE\", true);\n  var peg$e128 = peg$literalExpectation(\"LIMIT\", true);\n  var peg$e129 = peg$literalExpectation(\"NATURAL\", true);\n  var peg$e130 = peg$literalExpectation(\"NOT\", true);\n  var peg$e131 = peg$literalExpectation(\"NULL\", true);\n  var peg$e132 = peg$literalExpectation(\"OFFSET\", true);\n  var peg$e133 = peg$literalExpectation(\"ON\", true);\n  var peg$e134 = peg$literalExpectation(\"OR\", true);\n  var peg$e135 = peg$literalExpectation(\"ORDER\", true);\n  var peg$e136 = peg$literalExpectation(\"OUTER\", true);\n  var peg$e137 = peg$literalExpectation(\"OVER\", true);\n  var peg$e138 = peg$literalExpectation(\"OVERWRITE\", true);\n  var peg$e139 = peg$literalExpectation(\"PARTITIONED\", true);\n  var peg$e140 = peg$literalExpectation(\"PARTITION\", true);\n  var peg$e141 = peg$literalExpectation(\"POSITION\", true);\n  var peg$e142 = peg$literalExpectation(\"PRECEDING\", true);\n  var peg$e143 = peg$literalExpectation(\"RANGE\", true);\n  var peg$e144 = peg$literalExpectation(\"REPLACE\", true);\n  var peg$e145 = peg$literalExpectation(\"RETURNING\", true);\n  var peg$e146 = peg$literalExpectation(\"ROLLUP\", true);\n  var peg$e147 = peg$literalExpectation(\"ROWS\", true);\n  var peg$e148 = peg$literalExpectation(\"SELECT\", true);\n  var peg$e149 = peg$literalExpectation(\"SET\", true);\n  var peg$e150 = peg$literalExpectation(\"SOME\", true);\n  var peg$e151 = peg$literalExpectation(\"SYMMETRIC\", true);\n  var peg$e152 = peg$literalExpectation(\"TABLE\", true);\n  var peg$e153 = peg$literalExpectation(\"THEN\", true);\n  var peg$e154 = peg$literalExpectation(\"TIME\", true);\n  var peg$e155 = peg$literalExpectation(\"TIMESTAMP\", true);\n  var peg$e156 = peg$literalExpectation(\"TIMESTAMPADD\", true);\n  var peg$e157 = peg$literalExpectation(\"TIMESTAMPDIFF\", true);\n  var peg$e158 = peg$literalExpectation(\"TO\", true);\n  var peg$e159 = peg$literalExpectation(\"TRAILING\", true);\n  var peg$e160 = peg$literalExpectation(\"TRIM\", true);\n  var peg$e161 = peg$literalExpectation(\"TRUE\", true);\n  var peg$e162 = peg$literalExpectation(\"UNBOUNDED\", true);\n  var peg$e163 = peg$literalExpectation(\"UNION\", true);\n  var peg$e164 = peg$literalExpectation(\"USING\", true);\n  var peg$e165 = peg$literalExpectation(\"VALUES\", true);\n  var peg$e166 = peg$literalExpectation(\"WHEN\", true);\n  var peg$e167 = peg$literalExpectation(\"WHERE\", true);\n  var peg$e168 = peg$literalExpectation(\"WITH\", true);\n// @ts-ignore\n\n  var peg$f0 = function(initial, thing, final) {\n// @ts-ignore\n  if (initial) thing = thing.changeSpace('initial', initial);\n// @ts-ignore\n  if (final) thing = thing.changeSpace('final', final);\n// @ts-ignore\n  return thing;\n};// @ts-ignore\n\n  var peg$f1 = function(spaceBefore, statements, rest) {\n// @ts-ignore\n  let ret = {\n// @ts-ignore\n    spaceBefore: spaceBefore,\n// @ts-ignore\n    rest: rest\n  }\n\n// @ts-ignore\n  if (statements.length) {\n// @ts-ignore\n    ret.contextStatements = new S.SeparatedArray(\n// @ts-ignore\n      statements.map(function(x) { return x[0] }),\n// @ts-ignore\n      statements.map(function(x) { return x[1] }).slice(0, statements.length - 1)\n    );\n// @ts-ignore\n    ret.spaceAfter = statements[statements.length - 1][1];\n  }\n\n// @ts-ignore\n  return ret;\n};// @ts-ignore\n\n  var peg$f2 = function(expression, alias, columns) {\n// @ts-ignore\n  if (!alias) return expression;\n\n// @ts-ignore\n  var value = { expression: expression };\n// @ts-ignore\n  var spacing = value.spacing = {};\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  var as = alias[0];\n// @ts-ignore\n  if (as) {\n// @ts-ignore\n    spacing.preAs = as[0];\n// @ts-ignore\n    keywords.as = as[1];\n// @ts-ignore\n  } else {\n// @ts-ignore\n    keywords.as = '';\n  }\n\n// @ts-ignore\n  if (columns) {\n// @ts-ignore\n    spacing.preColumns = columns[0];\n// @ts-ignore\n    value.columns = columns[1];\n  }\n\n// @ts-ignore\n  spacing.preAlias = alias[1];\n// @ts-ignore\n  value.alias = alias[2];\n\n// @ts-ignore\n  return new S.SqlAlias(value);\n};// @ts-ignore\n\n  var peg$f3 = function(label, preArrow, postArrow, expression) {\n// @ts-ignore\n  return new S.SqlLabeledExpression({\n// @ts-ignore\n    label: label,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preArrow: preArrow,\n// @ts-ignore\n      postArrow: postArrow\n    },\n// @ts-ignore\n    expression: expression\n  });\n};// @ts-ignore\n\n  var peg$f4 = function(keyToken, postKey, key, postKeyExpression, valueToken, preValueExpression, value) {\n// @ts-ignore\n  return new S.SqlKeyValue({\n// @ts-ignore\n    key: key,\n// @ts-ignore\n    value: value,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postKey: postKey,\n// @ts-ignore\n      postKeyExpression: postKeyExpression,\n// @ts-ignore\n      preValueExpression: preValueExpression\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      key: keyToken,\n// @ts-ignore\n      value: valueToken\n    }\n  });\n};// @ts-ignore\n\n  var peg$f5 = function(key, postKeyExpression, preValueExpression, value) {\n// @ts-ignore\n  return new S.SqlKeyValue({\n// @ts-ignore\n    key: key,\n// @ts-ignore\n    value: value,\n// @ts-ignore\n    short: true,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postKeyExpression: postKeyExpression,\n// @ts-ignore\n      preValueExpression: preValueExpression\n    }\n  });\n};// @ts-ignore\n\n  var peg$f6 = function(extend, postLeftParen, head, tail, postColumnDeclarations) {\n// @ts-ignore\n  return new S.SqlExtendClause({\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      extend: extend ? extend[0] : ''\n    },\n// @ts-ignore\n    columnDeclarations: makeSeparatedArray(head, tail),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postExtend: extend ? extend[1] : undefined,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postColumnDeclarations: postColumnDeclarations\n    }\n  });\n};// @ts-ignore\n\n  var peg$f7 = function(column, postColumn, columnType) {\n// @ts-ignore\n  return new S.SqlColumnDeclaration({\n// @ts-ignore\n    column: column,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postColumn: postColumn\n    },\n// @ts-ignore\n    columnType: columnType\n  })\n};// @ts-ignore\n\n  var peg$f8 = function(statements, query) {\n// @ts-ignore\n  if (!statements.length) return query;\n// @ts-ignore\n  return query\n// @ts-ignore\n    .changeContextStatements(new S.SeparatedArray(\n// @ts-ignore\n      statements.map(function(x) { return x[0] }),\n// @ts-ignore\n      statements.map(function(x) { return x[1] }).slice(0, statements.length - 1)\n    ))\n// @ts-ignore\n    .changeSpace('postSets', statements[statements.length - 1][1]);\n};// @ts-ignore\n\n  var peg$f9 = function(setKeyword, postSet, key, postKey, postEquals, value, postValue) {\n// @ts-ignore\n  return new S.SqlSetStatement({\n// @ts-ignore\n    key: key,\n// @ts-ignore\n    value: value,\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      set: setKeyword\n    },\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postSet: postSet,\n// @ts-ignore\n      postKey: postKey,\n// @ts-ignore\n      postValue: postValue\n    }\n  });\n};// @ts-ignore\n\n  var peg$f10 = function(explain, insertClause, replaceClause, heart, orderByClause, limitClause, offsetClause, partitionedByClause, clusteredByClause, union) {\n// @ts-ignore\n  var value = {};\n// @ts-ignore\n  var keywords = value.keywords = {};\n// @ts-ignore\n  var spacing = value.spacing = {};\n\n// @ts-ignore\n  if (explain) {\n// @ts-ignore\n    value.explain = true;\n// @ts-ignore\n    keywords.explainPlanFor = explain[0];\n// @ts-ignore\n    spacing.postExplainPlanFor = explain[1];\n  }\n\n// @ts-ignore\n  if (insertClause && replaceClause) {\n// @ts-ignore\n    error('Can not have both an INSERT and a REPLACE clause');\n  }\n\n// @ts-ignore\n  if (insertClause) {\n// @ts-ignore\n    value.insertClause = insertClause[0];\n// @ts-ignore\n    spacing.postInsertClause = insertClause[1];\n  }\n\n// @ts-ignore\n  if (replaceClause) {\n// @ts-ignore\n    value.replaceClause = replaceClause[0];\n// @ts-ignore\n    spacing.postReplaceClause = replaceClause[1];\n  }\n\n// @ts-ignore\n  var withQueryMode = heart.length === 7;\n// @ts-ignore\n  if (withQueryMode) {\n// @ts-ignore\n    value.withClause = heart[0];\n// @ts-ignore\n    spacing.postWithClause = heart[1];\n// @ts-ignore\n    value.query = heart[4].addParens(heart[3], heart[5]);\n// @ts-ignore\n  } else {\n// @ts-ignore\n    var withClause = heart[0];\n// @ts-ignore\n    if (withClause) {\n// @ts-ignore\n      value.withClause = withClause[0];\n// @ts-ignore\n      spacing.postWithClause = withClause[1];\n    }\n\n// @ts-ignore\n    var subQuery = heart[1];\n// @ts-ignore\n    Object.assign(value, subQuery.value);\n// @ts-ignore\n    Object.assign(keywords, subQuery.keywords);\n// @ts-ignore\n    Object.assign(spacing, subQuery.spacing);\n  }\n\n// @ts-ignore\n  if (orderByClause) {\n// @ts-ignore\n    spacing.preOrderByClause = orderByClause[0];\n// @ts-ignore\n    value.orderByClause = orderByClause[1];\n  }\n\n// @ts-ignore\n  if (limitClause) {\n// @ts-ignore\n    spacing.preLimitClause = limitClause[0];\n// @ts-ignore\n    value.limitClause = limitClause[1];\n  }\n\n// @ts-ignore\n  if (offsetClause) {\n// @ts-ignore\n    spacing.preOffsetClause = offsetClause[0];\n// @ts-ignore\n    value.offsetClause = offsetClause[1];\n  }\n\n// @ts-ignore\n  if (partitionedByClause) {\n// @ts-ignore\n    spacing.prePartitionedByClause = partitionedByClause[0];\n// @ts-ignore\n    value.partitionedByClause = partitionedByClause[1];\n  }\n\n// @ts-ignore\n  if (clusteredByClause) {\n// @ts-ignore\n    spacing.preClusteredByClause = clusteredByClause[0];\n// @ts-ignore\n    value.clusteredByClause = clusteredByClause[1];\n  }\n\n// @ts-ignore\n  if (union) {\n// @ts-ignore\n    spacing.preUnion = union[0];\n// @ts-ignore\n    keywords.union = union[1].unionKeyword;\n// @ts-ignore\n    spacing.postUnion = union[1].postUnion;\n// @ts-ignore\n    value.unionQuery = union[1].unionQuery;\n  }\n\n// @ts-ignore\n  return withQueryMode ? new S.SqlWithQuery(value) : new S.SqlQuery(value);\n};// @ts-ignore\n\n  var peg$f11 = function(select, fromClause, whereClause, groupByClause, havingClause) {\n// @ts-ignore\n  var value = {};\n// @ts-ignore\n  var keywords = {};\n// @ts-ignore\n  var spacing = {};\n\n// @ts-ignore\n  keywords.select = select.selectKeyword;\n// @ts-ignore\n  spacing.postSelect = select.postSelect;\n// @ts-ignore\n  value.decorator = select.decorator;\n// @ts-ignore\n  keywords.decorator = select.decoratorKeyword;\n// @ts-ignore\n  spacing.postDecorator = select.postDecorator;\n// @ts-ignore\n  value.selectExpressions = select.selectExpressions;\n\n// @ts-ignore\n  if (fromClause) {\n// @ts-ignore\n    spacing.preFromClause = fromClause[0];\n// @ts-ignore\n    value.fromClause = fromClause[1];\n  }\n\n// @ts-ignore\n  if (whereClause) {\n// @ts-ignore\n    spacing.preWhereClause = whereClause[0];\n// @ts-ignore\n    value.whereClause = whereClause[1];\n  }\n\n// @ts-ignore\n  if (groupByClause) {\n// @ts-ignore\n    spacing.preGroupByClause = groupByClause[0];\n// @ts-ignore\n    value.groupByClause = groupByClause[1];\n  }\n\n// @ts-ignore\n  if (havingClause) {\n// @ts-ignore\n    spacing.preHavingClause = havingClause[0];\n// @ts-ignore\n    value.havingClause = havingClause[1];\n  }\n\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: value,\n// @ts-ignore\n    keywords: keywords,\n// @ts-ignore\n    spacing: spacing,\n  };\n};// @ts-ignore\n\n  var peg$f12 = function(insert, postInsert, into, postInto, table, columns, format) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    table: table,\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      insert: insert,\n// @ts-ignore\n      into: into\n    },\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postInsert: postInsert,\n// @ts-ignore\n      postInto: postInto\n    }\n  };\n\n// @ts-ignore\n  if (columns) {\n// @ts-ignore\n    value.spacing.preColumns = columns[0];\n// @ts-ignore\n    value.columns = columns[1];\n  }\n\n// @ts-ignore\n  if (format) {\n// @ts-ignore\n    value.spacing.preAs = format[0];\n// @ts-ignore\n    value.keywords = format[1];\n// @ts-ignore\n    value.spacing.preFormat = format[2];\n// @ts-ignore\n    value.format = format[3];\n  }\n\n// @ts-ignore\n  return new S.SqlInsertClause(value);\n};// @ts-ignore\n\n  var peg$f13 = function(replace, postReplace, into, postInto, table, columns, preOverwrite, overwrite, postOverwrite, allOrWhere) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    table: table,\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      replace: replace,\n// @ts-ignore\n      into: into,\n// @ts-ignore\n      overwrite: overwrite\n    },\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postReplace: postReplace,\n// @ts-ignore\n      postInto: postInto,\n// @ts-ignore\n      preOverwrite: preOverwrite,\n// @ts-ignore\n      postOverwrite: postOverwrite\n    }\n  };\n\n// @ts-ignore\n  if (columns) {\n// @ts-ignore\n    value.spacing.preColumns = columns[0];\n// @ts-ignore\n    value.columns = columns[1];\n  }\n\n// @ts-ignore\n  if (typeof allOrWhere === 'string') {\n// @ts-ignore\n    value.keywords.all = allOrWhere;\n// @ts-ignore\n  } else {\n// @ts-ignore\n    value.whereClause = allOrWhere;\n  }\n\n// @ts-ignore\n  return new S.SqlReplaceClause(value);\n};// @ts-ignore\n\n  var peg$f14 = function(withKeyword, postWith, head, tail) {\n// @ts-ignore\n  return new S.SqlWithClause({\n// @ts-ignore\n    withParts: makeSeparatedArray(head, tail),\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      'with': withKeyword\n    },\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postWith: postWith\n    }\n  });\n};// @ts-ignore\n\n  var peg$f15 = function(table, postTable, columns, asKeyword, postAs, query) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    table: table,\n// @ts-ignore\n    query: query,\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    postTable: postTable,\n// @ts-ignore\n    postAs: postAs,\n  };\n// @ts-ignore\n  var keywords = value.keywords = {\n// @ts-ignore\n    as: asKeyword,\n  };\n// @ts-ignore\n  if (columns) {\n// @ts-ignore\n    value.columns = columns[0];\n// @ts-ignore\n    spacing.postColumns = columns[1];\n  }\n// @ts-ignore\n  return new S.SqlWithPart(value);\n};// @ts-ignore\n\n  var peg$f16 = function(postLeftParen, head, tail, preRightParen) {\n// @ts-ignore\n  return new S.SqlColumnList({\n// @ts-ignore\n    columns: makeSeparatedArray(head, tail)\n// @ts-ignore\n  }).addParens(postLeftParen, preRightParen);\n};// @ts-ignore\n\n  var peg$f17 = function(selectKeyword, postSelect, decorator, head, tail) {\n// @ts-ignore\n  var ret = {\n// @ts-ignore\n    selectKeyword: selectKeyword,\n// @ts-ignore\n    postSelect: postSelect,\n// @ts-ignore\n    selectExpressions: makeSeparatedArray(head, tail),\n  };\n// @ts-ignore\n  if (decorator) {\n// @ts-ignore\n    ret.decorator = decorator[0].toUpperCase();\n// @ts-ignore\n    ret.decoratorKeyword = decorator[0];\n// @ts-ignore\n    ret.postDecorator = decorator[1];\n  }\n// @ts-ignore\n  return ret;\n};// @ts-ignore\n\n  var peg$f18 = function(from, postFrom, head, tail, join) {\n// @ts-ignore\n  return new S.SqlFromClause({\n// @ts-ignore\n    expressions: makeSeparatedArray(head, tail).map(function(ex) { return ex.convertToTable() }),\n// @ts-ignore\n    joinParts: join ? join[1] : undefined,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postFrom: postFrom,\n// @ts-ignore\n      preJoin: join ? join[0] : undefined,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      from: from,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f19 = function(head, tail) {\n// @ts-ignore\n  return makeSeparatedArray(head, tail);\n};// @ts-ignore\n\n  var peg$f20 = function(natural, joinType, join, postJoin, table, joinCondition) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    table: table.convertToTable(),\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    postJoin: postJoin,\n  };\n// @ts-ignore\n  var keywords = value.keywords = {\n// @ts-ignore\n    join: join,\n  };\n\n// @ts-ignore\n  if (natural) {\n// @ts-ignore\n    value.natural = true;\n// @ts-ignore\n    keywords.natural = natural[0];\n// @ts-ignore\n    spacing.postNatural = natural[1];\n  }\n\n// @ts-ignore\n  if (joinType) {\n// @ts-ignore\n    var joinTypeUpper = joinType[0].toUpperCase();\n// @ts-ignore\n    var m = joinTypeUpper.match(/^LEFT|RIGHT|FULL/);\n// @ts-ignore\n    if (m) joinTypeUpper = m[0];\n// @ts-ignore\n    value.joinType = joinTypeUpper;\n// @ts-ignore\n    keywords.joinType = joinType[0];\n// @ts-ignore\n    spacing.postJoinType = joinType[1];\n  }\n\n// @ts-ignore\n  if (joinCondition) {\n// @ts-ignore\n    if(joinCondition[1].toUpperCase() === 'USING'){\n// @ts-ignore\n      spacing.preUsing = joinCondition[0];\n// @ts-ignore\n      keywords.using = joinCondition[1];\n// @ts-ignore\n      spacing.postUsing = joinCondition[2];\n// @ts-ignore\n      value.usingColumns = joinCondition[3];\n// @ts-ignore\n    } else {\n// @ts-ignore\n      spacing.preOn = joinCondition[0];\n// @ts-ignore\n      keywords.on = joinCondition[1];\n// @ts-ignore\n      spacing.postOn = joinCondition[2];\n// @ts-ignore\n      value.onExpression = joinCondition[3];\n    }\n  }\n\n// @ts-ignore\n  return new S.SqlJoinPart(value);\n};// @ts-ignore\n\n  var peg$f21 = function(where, postWhere, expression) {\n// @ts-ignore\n  return new S.SqlWhereClause({\n// @ts-ignore\n    expression: expression,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postWhere: postWhere,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      where: where,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f22 = function(groupBy, postGroupBy, decorator, ex) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postGroupBy: postGroupBy\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      groupBy: groupBy\n    }\n  };\n\n// @ts-ignore\n  if (decorator) {\n// @ts-ignore\n    var d = decorator[0].toUpperCase();\n// @ts-ignore\n    value.decorator = d.startsWith('GROUPING') ? 'GROUPING SETS' : d;\n// @ts-ignore\n    value.spacing.postDecorator = decorator[1];\n// @ts-ignore\n    value.keywords.decorator = decorator[0];\n  }\n\n// @ts-ignore\n  if (Array.isArray(ex)) {\n// @ts-ignore\n    var postLeftParen = ex[1];\n// @ts-ignore\n    if (ex[2]) {\n// @ts-ignore\n      value.innerParens = true;\n// @ts-ignore\n      value.expressions = ex[2][0];\n// @ts-ignore\n      value.spacing.postLeftParen = postLeftParen;\n// @ts-ignore\n      value.spacing.postExpressions = ex[2][1];\n// @ts-ignore\n    } else {\n      // Here we have `GROUP BY ()` so `innerParens` will be implicitly true\n// @ts-ignore\n      value.spacing.postLeftParen = postLeftParen;\n    }\n// @ts-ignore\n  } else {\n// @ts-ignore\n    value.expressions = ex;\n  }\n\n// @ts-ignore\n  return new S.SqlGroupByClause(value);\n};// @ts-ignore\n\n  var peg$f23 = function(head, tail) {\n// @ts-ignore\n  return makeSeparatedArray(head, tail);\n};// @ts-ignore\n\n  var peg$f24 = function(postLeftParen) {\n// @ts-ignore\n  return new S.SqlRecord({\n// @ts-ignore\n    keywords: { row: '' },\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postLeftParen: postLeftParen,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f25 = function(having, postHaving, expression) {\n// @ts-ignore\n  return new S.SqlHavingClause({\n// @ts-ignore\n    expression: expression,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postHaving: postHaving\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      having: having\n    }\n  });\n};// @ts-ignore\n\n  var peg$f26 = function(orderBy, postOrderBy, head, tail) {\n// @ts-ignore\n  return new S.SqlOrderByClause({\n// @ts-ignore\n    expressions: makeSeparatedArray(head, tail),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postOrderBy: postOrderBy\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      orderBy: orderBy\n    }\n  });\n};// @ts-ignore\n\n  var peg$f27 = function(expression, direction) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    expression: expression,\n  };\n// @ts-ignore\n  var spacing = value.spacing = {};\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  if (direction) {\n// @ts-ignore\n    spacing.preDirection = direction[0];\n// @ts-ignore\n    value.direction = direction[1].toUpperCase();\n// @ts-ignore\n    keywords.direction = direction[1];\n  }\n\n// @ts-ignore\n  return new S.SqlOrderByExpression(value);\n};// @ts-ignore\n\n  var peg$f28 = function(limit, postLimit, limitLiteral) {\n// @ts-ignore\n  return new S.SqlLimitClause({\n// @ts-ignore\n    limit: limitLiteral,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postLimit: postLimit,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      limit: limit,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f29 = function(offset, postOffset, offsetLiteral) {\n// @ts-ignore\n  return new S.SqlOffsetClause({\n// @ts-ignore\n    offset: offsetLiteral,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postOffset: postOffset,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      offset: offset,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f30 = function(partitionedBy, postPartitionedBy, ex) {\n// @ts-ignore\n  var value = {};\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    postPartitionedBy: postPartitionedBy\n  };\n// @ts-ignore\n  var keywords = value.keywords = {\n// @ts-ignore\n    partitionedBy: partitionedBy\n  };\n\n// @ts-ignore\n  if (Array.isArray(ex)) {\n// @ts-ignore\n    var ex1 = ex[1];\n// @ts-ignore\n    keywords.all = ex[0] + (ex1 ? ex1.join('') : '');\n// @ts-ignore\n  } else {\n// @ts-ignore\n    value.expression = ex;\n  }\n\n// @ts-ignore\n  return new S.SqlPartitionedByClause(value);\n};// @ts-ignore\n\n  var peg$f31 = function(clusteredBy, postClusteredBy, head, tail) {\n// @ts-ignore\n  return new S.SqlClusteredByClause({\n// @ts-ignore\n    expressions: makeSeparatedArray(head, tail),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postClusteredBy: postClusteredBy\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      clusteredBy: clusteredBy,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f32 = function(unionKeyword, postUnion, unionQuery) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    unionKeyword: unionKeyword,\n// @ts-ignore\n    postUnion: postUnion,\n// @ts-ignore\n    unionQuery: unionQuery\n  };\n};// @ts-ignore\n\n  var peg$f33 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('OR', head, tail);\n};// @ts-ignore\n\n  var peg$f34 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('AND', head, tail);\n};// @ts-ignore\n\n  var peg$f35 = function(op, postOp, argument) {\n// @ts-ignore\n  return new S.SqlUnary({\n// @ts-ignore\n    op: op.toUpperCase(),\n// @ts-ignore\n    argument: argument,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postOp: postOp\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      op: op,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f36 = function(lhs, rhs) {\n// @ts-ignore\n  if (!rhs) return lhs;\n// @ts-ignore\n  var preOp = rhs[0];\n// @ts-ignore\n  var opRhs = rhs[1];\n// @ts-ignore\n  return new S.SqlComparison({\n// @ts-ignore\n    lhs: lhs,\n// @ts-ignore\n    op: opRhs.op,\n// @ts-ignore\n    decorator: opRhs.decorator,\n// @ts-ignore\n    rhs: opRhs.rhs,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preOp: opRhs.preOp ? opRhs.preOp : preOp,\n// @ts-ignore\n      postOp: opRhs.postOp,\n// @ts-ignore\n      postDecorator: opRhs.postDecorator\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      op: opRhs.opKeyword,\n// @ts-ignore\n      decorator: opRhs.decoratorKeyword,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f37 = function(op, postOp, rhs) {\n// @ts-ignore\n  const ret = {\n// @ts-ignore\n    op: op === '!=' ? '<>' : op,\n// @ts-ignore\n    opKeyword: op,\n// @ts-ignore\n    postOp: postOp,\n  };\n// @ts-ignore\n  if (Array.isArray(rhs)) {\n// @ts-ignore\n    var decorator = rhs[0];\n// @ts-ignore\n    var decoratorUpper = decorator.toUpperCase();\n// @ts-ignore\n    ret.decorator = decoratorUpper === 'SOME' ? 'ANY' : decoratorUpper;\n// @ts-ignore\n    ret.decoratorKeyword = decorator;\n// @ts-ignore\n    ret.postDecorator = rhs[1];\n// @ts-ignore\n    ret.rhs = rhs[2];\n// @ts-ignore\n  } else {\n// @ts-ignore\n    ret.rhs = rhs;\n  }\n// @ts-ignore\n  return ret;\n};// @ts-ignore\n\n  var peg$f38 = function(op, postOp, rhs) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    op: 'IS' + (op[1] ? ' NOT' : '') + (op[2] ? ' DISTINCT FROM' : ''),\n// @ts-ignore\n    opKeyword: op.map(o => o ? o : '').join(''),\n// @ts-ignore\n    postOp: postOp,\n// @ts-ignore\n    rhs: rhs\n  };\n};// @ts-ignore\n\n  var peg$f39 = function(op, postOp, rhs) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    op: op[0] ? 'NOT IN' : 'IN',\n// @ts-ignore\n    opKeyword: op[0] ? op.join('') : op[1],\n// @ts-ignore\n    postOp: postOp,\n// @ts-ignore\n    rhs: rhs\n  };\n};// @ts-ignore\n\n  var peg$f40 = function(op, postOp, symmetricKeyword, start, preAnd, andKeyword, postAnd, end) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    start: start,\n// @ts-ignore\n    end: end,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preAnd: preAnd,\n// @ts-ignore\n      postAnd: postAnd,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      and: andKeyword,\n    }\n  }\n\n// @ts-ignore\n  if (symmetricKeyword) {\n// @ts-ignore\n    value.symmetric = true;\n// @ts-ignore\n    value.keywords.symmetric = symmetricKeyword[0];\n// @ts-ignore\n    value.spacing.postSymmetric = symmetricKeyword[1];\n  }\n\n// @ts-ignore\n  return {\n// @ts-ignore\n    op: op[0] ? 'NOT BETWEEN' : 'BETWEEN',\n// @ts-ignore\n    opKeyword: op[0] ? op.join('') : op[1],\n// @ts-ignore\n    postOp: postOp,\n// @ts-ignore\n    rhs: new S.SqlBetweenPart(value)\n  };\n};// @ts-ignore\n\n  var peg$f41 = function(op, postOp, like, escape) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    op: op[0] ? 'NOT LIKE' : 'LIKE',\n// @ts-ignore\n    opKeyword: op[0] ? op.join('') : op[1],\n// @ts-ignore\n    postOp: postOp,\n// @ts-ignore\n    rhs: escape ? new S.SqlLikePart({\n// @ts-ignore\n      like: like,\n// @ts-ignore\n      escape: escape[3],\n// @ts-ignore\n      spacing: {\n// @ts-ignore\n        preEscape: escape[0],\n// @ts-ignore\n        postEscape: escape[2],\n      },\n// @ts-ignore\n      keywords: {\n// @ts-ignore\n        escape: escape[1],\n      },\n// @ts-ignore\n    }) : like\n  };\n};// @ts-ignore\n\n  var peg$f42 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('+', head, tail);\n};// @ts-ignore\n\n  var peg$f43 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('-', head, tail);\n};// @ts-ignore\n\n  var peg$f44 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('*', head, tail);\n};// @ts-ignore\n\n  var peg$f45 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('/', head, tail);\n};// @ts-ignore\n\n  var peg$f46 = function(op, postOp, argument) {\n// @ts-ignore\n  return new S.SqlUnary({\n// @ts-ignore\n    op: op,\n// @ts-ignore\n    argument: argument,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postOp: postOp\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      op: op,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f47 = function(head, tail) {\n// @ts-ignore\n  return maybeMakeMulti('||', head, tail);\n};// @ts-ignore\n\n  var peg$f48 = function(caseToken, postCase, caseExpression, head, tail, elseValue, preEnd, end) {\n// @ts-ignore\n  return new S.SqlCase({\n// @ts-ignore\n    caseExpression: caseExpression ? caseExpression[0] : undefined,\n// @ts-ignore\n    whenThenParts: makeSeparatedArray(head, tail),\n// @ts-ignore\n    elseExpression: elseValue ? elseValue[3] : undefined,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postCase: postCase,\n// @ts-ignore\n      postCaseExpression: caseExpression ? caseExpression[1] : undefined,\n// @ts-ignore\n      preElse: elseValue ? elseValue[0] : undefined,\n// @ts-ignore\n      postElse: elseValue ? elseValue[2] : undefined,\n// @ts-ignore\n      preEnd: preEnd,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      'case': caseToken,\n// @ts-ignore\n      'else': elseValue ? elseValue[1] : undefined,\n// @ts-ignore\n      end: end,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f49 = function(when, postWhen, whenHead, whenTail, postWhenExpressions, then, postThen, thenExpression) {\n// @ts-ignore\n  return new S.SqlWhenThenPart({\n// @ts-ignore\n    whenExpressions: makeSeparatedArray(whenHead, whenTail),\n// @ts-ignore\n    thenExpression: thenExpression,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postWhen: postWhen,\n// @ts-ignore\n      postWhenExpressions: postWhenExpressions,\n// @ts-ignore\n      postThen: postThen,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      when: when,\n// @ts-ignore\n      then: then,\n    },\n  });\n};// @ts-ignore\n\n  var peg$f50 = function(interval, postInterval, intervalValue, postIntervalValue, unit) {\n// @ts-ignore\n  return new S.SqlInterval({\n// @ts-ignore\n    intervalValue: intervalValue,\n// @ts-ignore\n    unit: unit,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postInterval: postInterval,\n// @ts-ignore\n      postIntervalValue: postIntervalValue\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      interval: interval,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f51 = function(unit) {\n// @ts-ignore\n  return S.SqlLiteral.direct(unit);\n};// @ts-ignore\n\n  var peg$f52 = function(functionName, namespaceExtra, preLeftParen, postLeftParen, decorator, head, tail, postArguments, filter, window, extend) {\n// @ts-ignore\n  var value = {};\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen,\n  };\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  if (namespaceExtra) {\n// @ts-ignore\n    value.namespace = new S.SqlNamespace({ refName: functionName });\n// @ts-ignore\n    spacing.postNamespace = namespaceExtra[0];\n// @ts-ignore\n    spacing.postDot = namespaceExtra[2];\n// @ts-ignore\n    value.functionName = namespaceExtra[3];\n// @ts-ignore\n  } else {\n// @ts-ignore\n    value.functionName = functionName;\n  }\n\n// @ts-ignore\n  if (decorator) {\n// @ts-ignore\n    value.decorator = decorator[0].toUpperCase();\n// @ts-ignore\n    keywords.decorator = decorator[0];\n// @ts-ignore\n    spacing.postDecorator = decorator[1];\n  }\n\n// @ts-ignore\n  if (head) {\n// @ts-ignore\n    value.args = makeSeparatedArray(head, tail);\n// @ts-ignore\n    spacing.postArguments = postArguments;\n  }\n\n// @ts-ignore\n  if (filter) {\n// @ts-ignore\n    spacing.preFilter = filter[0];\n// @ts-ignore\n    keywords.filter = filter[1].filterKeyword;\n// @ts-ignore\n    spacing.postFilter = filter[1].postFilter;\n// @ts-ignore\n    value.whereClause = filter[1].whereClause;\n  }\n\n// @ts-ignore\n  if (window) {\n// @ts-ignore\n    spacing.preOver = window[0];\n// @ts-ignore\n    keywords.over = window[1];\n// @ts-ignore\n    spacing.postOver = window[2];\n// @ts-ignore\n    value.windowSpec = window[3];\n  }\n\n// @ts-ignore\n  if (extend) {\n// @ts-ignore\n    value.spacing.preExtend = extend[0];\n// @ts-ignore\n    value.extendClause = extend[1];\n  }\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f53 = function(functionName) {// @ts-ignore\n return S.SqlFunction.isNakedFunction(functionName) };// @ts-ignore\n\n  var peg$f54 = function(functionName) {\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: new S.RefName({ name: functionName, quotes: false }),\n// @ts-ignore\n    specialParen: 'none'\n  });\n};// @ts-ignore\n\n  var peg$f55 = function(functionName, preLeftParen, postLeftParen, postArguments, filter, window) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    functionName: makeFunctionName(functionName)\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen,\n  };\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  value.args = S.SeparatedArray.fromSingleValue(S.SqlStar.PLAIN);\n// @ts-ignore\n  spacing.postArguments = postArguments;\n\n// @ts-ignore\n  if (filter) {\n// @ts-ignore\n    spacing.preFilter = filter[0];\n// @ts-ignore\n    keywords.filter = filter[1].filterKeyword;\n// @ts-ignore\n    spacing.postFilter = filter[1].postFilter;\n// @ts-ignore\n    value.whereClause = filter[1].whereClause;\n  }\n\n// @ts-ignore\n  if (window) {\n// @ts-ignore\n    spacing.preOver = window[0];\n// @ts-ignore\n    keywords.over = window[1];\n// @ts-ignore\n    spacing.postOver = window[2];\n// @ts-ignore\n    value.windowSpec = window[3];\n  }\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f56 = function(functionName, preLeftParen, postLeftParen, expr, separator, type, postArguments) {\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: new S.SeparatedArray([expr, type], [separator]),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preLeftParen: preLeftParen,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postArguments: postArguments,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f57 = function(functionName, preLeftParen, postLeftParen, expr, commaSeparator, path, returningSeparator, type, postArguments) {\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: new S.SeparatedArray([expr, path, type], [commaSeparator, returningSeparator]),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preLeftParen: preLeftParen,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postArguments: postArguments,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f58 = function(functionName, preLeftParen, postLeftParen, head, tail, postArguments) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    functionName: makeFunctionName(functionName)\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen\n  };\n\n// @ts-ignore\n  if (head) {\n// @ts-ignore\n    value.args = makeSeparatedArray(head, tail);\n// @ts-ignore\n    spacing.postArguments = postArguments;\n  }\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f59 = function(functionName, preLeftParen, postLeftParen, unit, separator, expr, postArguments) {\n// @ts-ignore\n  var unitLiteral = new S.SqlLiteral({\n// @ts-ignore\n    value: unit.toUpperCase(),\n// @ts-ignore\n    stringValue: unit,\n  });\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: new S.SeparatedArray([unitLiteral, expr], [separator]),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preLeftParen: preLeftParen,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postArguments: postArguments,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f60 = function(functionName, preLeftParen, postLeftParen, decorator, expr, from, postArguments) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: from\n// @ts-ignore\n      ? new S.SeparatedArray([expr, from[1]], [from[0]])\n// @ts-ignore\n      : S.SeparatedArray.fromSingleValue(expr),\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen,\n// @ts-ignore\n    postArguments: postArguments,\n  };\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  if (decorator) {\n// @ts-ignore\n    value.decorator = decorator[0].toUpperCase();\n// @ts-ignore\n    keywords.decorator = decorator[0];\n// @ts-ignore\n    spacing.postDecorator = decorator[1];\n  }\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f61 = function(functionName, preLeftParen, postLeftParen, expr, separator, unit, postArguments) {\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: new S.SeparatedArray([expr, unit], [separator]),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preLeftParen: preLeftParen,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postArguments: postArguments,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f62 = function(functionName, preLeftParen, postLeftParen, unit, tail, postArguments) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    functionName: makeFunctionName(functionName)\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen,\n  };\n\n// @ts-ignore\n  value.args = makeSeparatedArray(unit, tail);\n// @ts-ignore\n  spacing.postArguments = postArguments;\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f63 = function(functionName, preLeftParen, postLeftParen, expr1, inSeparator, expr2, extra, postArguments) {\n// @ts-ignore\n  var args = extra\n// @ts-ignore\n    ? new S.SeparatedArray([expr1, expr2, extra[1]], [inSeparator, extra[0]])\n// @ts-ignore\n    : new S.SeparatedArray([expr1, expr2], [inSeparator])\n\n// @ts-ignore\n  return new S.SqlFunction({\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    args: args,\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      preLeftParen: preLeftParen,\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postArguments: postArguments,\n    }\n  });\n};// @ts-ignore\n\n  var peg$f64 = function(functionName, preLeftParen, postLeftParen, head, tail, postArguments) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    functionName: makeFunctionName(functionName),\n// @ts-ignore\n    specialParen: 'square'\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    preLeftParen: preLeftParen,\n// @ts-ignore\n    postLeftParen: postLeftParen,\n  };\n\n// @ts-ignore\n  if (head) {\n// @ts-ignore\n    value.args = makeSeparatedArray(head, tail);\n// @ts-ignore\n    spacing.postArguments = postArguments;\n  }\n\n// @ts-ignore\n  return new S.SqlFunction(value);\n};// @ts-ignore\n\n  var peg$f65 = function(filterKeyword, postFilter, postLeftParen, whereClause, preRightParen) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    filterKeyword: filterKeyword,\n// @ts-ignore\n    postFilter: postFilter,\n// @ts-ignore\n    whereClause: whereClause.addParens(postLeftParen, preRightParen),\n  };\n};// @ts-ignore\n\n  var peg$f66 = function(postLeftParen, windowName, partitionByClause, orderByClause, frame) {\n// @ts-ignore\n  var value = {};\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    postLeftParen: postLeftParen\n  };\n// @ts-ignore\n  var keywords = value.keywords = {};\n\n// @ts-ignore\n  if (windowName) {\n// @ts-ignore\n    value.windowName = windowName[0];\n// @ts-ignore\n    spacing.postWindowName = windowName[1];\n  }\n\n// @ts-ignore\n  if (partitionByClause) {\n// @ts-ignore\n    value.partitionByClause = partitionByClause[0];\n// @ts-ignore\n    spacing.postPartitionBy = partitionByClause[1];\n  }\n\n// @ts-ignore\n  if (orderByClause) {\n// @ts-ignore\n    value.orderByClause = orderByClause[0];\n// @ts-ignore\n    spacing.postOrderBy = orderByClause[1];\n  }\n\n// @ts-ignore\n  if (frame) {\n// @ts-ignore\n    if (frame[0].toUpperCase() === 'ROWS') {\n// @ts-ignore\n      value.frameType = 'rows';\n// @ts-ignore\n      keywords.rows = frame[0];\n// @ts-ignore\n    } else {\n// @ts-ignore\n      value.frameType = 'range';\n// @ts-ignore\n      keywords.range = frame[0];\n    }\n\n// @ts-ignore\n    spacing.postFrameType = frame[1];\n\n// @ts-ignore\n    var b = frame[2];\n// @ts-ignore\n    if (Array.isArray(b)) {\n// @ts-ignore\n      keywords.between = b[0];\n// @ts-ignore\n      spacing.postBetween = b[1];\n// @ts-ignore\n      value.frameBound1 = b[2];\n// @ts-ignore\n      spacing.preAnd = b[3];\n// @ts-ignore\n      keywords.and = b[4];\n// @ts-ignore\n      spacing.postAnd = b[5];\n// @ts-ignore\n      value.frameBound2 = b[6];\n// @ts-ignore\n    } else {\n// @ts-ignore\n      value.frameBound1 = b;\n    }\n\n// @ts-ignore\n    spacing.postFrame = frame[3];\n  }\n\n// @ts-ignore\n  return new S.SqlWindowSpec(value);\n};// @ts-ignore\n\n  var peg$f67 = function(partitionBy, postPartitionBy, ex) {\n// @ts-ignore\n  return new S.SqlPartitionByClause({\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postPartitionBy: postPartitionBy\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      partitionBy: partitionBy\n    },\n// @ts-ignore\n    expressions: ex\n  });\n};// @ts-ignore\n\n  var peg$f68 = function(v) {\n// @ts-ignore\n  if (Array.isArray(v)) {\n// @ts-ignore\n    var n = parseInt(v[0], 10);\n// @ts-ignore\n    var value = {\n// @ts-ignore\n      boundValue: isNaN(n) ? 'unbounded' : n,\n// @ts-ignore\n      keywords: {},\n// @ts-ignore\n      spacing: {\n// @ts-ignore\n        postBoundValue: v[1]\n      }\n    }\n\n// @ts-ignore\n    if (isNaN(n)) {\n// @ts-ignore\n      value.keywords.unbounded = v[0];\n    }\n\n// @ts-ignore\n    if (value.following = v[2].toUpperCase() === 'FOLLOWING') {\n// @ts-ignore\n      value.keywords.following = v[2];\n// @ts-ignore\n    } else {\n// @ts-ignore\n      value.keywords.preceding = v[2];\n    }\n\n// @ts-ignore\n    return new S.SqlFrameBound(value);\n// @ts-ignore\n  } else {\n// @ts-ignore\n    return new S.SqlFrameBound({\n// @ts-ignore\n      boundValue: 'currentRow',\n// @ts-ignore\n      keywords: {\n// @ts-ignore\n        currentRow: v\n      }\n    });\n  }\n};// @ts-ignore\n\n  var peg$f69 = function(left, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: ',',\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f70 = function(left, separator, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: separator,\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f71 = function(left, separator, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: separator,\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f72 = function(left, separator, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: separator,\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f73 = function(left, separator, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: separator,\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f74 = function(left, separator, right) {\n// @ts-ignore\n  return new S.Separator({\n// @ts-ignore\n    left: left,\n// @ts-ignore\n    separator: separator,\n// @ts-ignore\n    right: right,\n  });\n};// @ts-ignore\n\n  var peg$f75 = function(record) {\n// @ts-ignore\n  return record.unwrapIfSingleton();\n};// @ts-ignore\n\n  var peg$f76 = function(row, postLeftParen, head, tail, postExpressions) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    expressions: makeSeparatedArray(head, tail),\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postLeftParen: postLeftParen,\n// @ts-ignore\n      postExpressions: postExpressions\n    }\n  }\n\n// @ts-ignore\n  if (row) {\n// @ts-ignore\n    value.keywords = { row: row[0] };\n// @ts-ignore\n    value.spacing.postRow = row[1];\n// @ts-ignore\n  } else {\n// @ts-ignore\n    value.keywords = { row: '' };\n  }\n\n// @ts-ignore\n  return new S.SqlRecord(value);\n};// @ts-ignore\n\n  var peg$f77 = function(leftSpacing, ex, rightSpacing) {\n// @ts-ignore\n  return ex.addParens(leftSpacing, rightSpacing);\n};// @ts-ignore\n\n  var peg$f78 = function(values, postValues, head, tail, orderByClause, limitClause, offsetClause) {\n// @ts-ignore\n  var value = {\n// @ts-ignore\n    records: makeSeparatedArray(head, tail),\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      values: values\n    }\n  };\n// @ts-ignore\n  var spacing = value.spacing = {\n// @ts-ignore\n    postValues: postValues\n  };\n\n// @ts-ignore\n  if (orderByClause) {\n// @ts-ignore\n    spacing.preOrderByClause = orderByClause[0];\n// @ts-ignore\n    value.orderByClause = orderByClause[1];\n  }\n\n// @ts-ignore\n  if (limitClause) {\n// @ts-ignore\n    spacing.preLimitClause = limitClause[0];\n// @ts-ignore\n    value.limitClause = limitClause[1];\n  }\n\n// @ts-ignore\n  if (offsetClause) {\n// @ts-ignore\n    spacing.preOffsetClause = offsetClause[0];\n// @ts-ignore\n    value.offsetClause = offsetClause[1];\n  }\n\n// @ts-ignore\n  return new S.SqlValues(value);\n};// @ts-ignore\n\n  var peg$f79 = function() {\n// @ts-ignore\n  return new S.SqlPlaceholder();\n};// @ts-ignore\n\n  var peg$f80 = function(lit) {\n// @ts-ignore\n  return new S.SqlLiteral(lit);\n};// @ts-ignore\n\n  var peg$f81 = function(v) {\n// @ts-ignore\n  return new S.SqlLiteral(v);\n};// @ts-ignore\n\n  var peg$f82 = function(v) {\n// @ts-ignore\n  return new S.SqlLiteral(v);\n};// @ts-ignore\n\n  var peg$f83 = function() {\n// @ts-ignore\n  return S.SqlType.create(text());\n};// @ts-ignore\n\n  var peg$f84 = function() {\n// @ts-ignore\n  var str = text();\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: str.length > 15 && str.indexOf('.') === -1 ? BigInt(str) : +str,\n// @ts-ignore\n    stringValue: str\n  };\n};// @ts-ignore\n\n  var peg$f85 = function(v) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: v.replace(/''/g, \"'\"),\n// @ts-ignore\n    stringValue: text()\n  };\n};// @ts-ignore\n\n  var peg$f86 = function(v) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: v.value.replace(/\\\\(\\\\|(?:[0-9a-f]{4}))/gi, function(_, s) { return s === '\\\\' ? '\\\\' : String.fromCharCode(parseInt(s, 16)); }),\n// @ts-ignore\n    stringValue: text()\n  };\n};// @ts-ignore\n\n  var peg$f87 = function(v) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: v.value, // ToDo: fix this\n// @ts-ignore\n    stringValue: text()\n  };\n};// @ts-ignore\n\n  var peg$f88 = function(v) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    value: v, // ToDo: fix this\n// @ts-ignore\n    stringValue: text()\n  };\n};// @ts-ignore\n\n  var peg$f89 = function(timestamp, postTimestamp, v) {\n// @ts-ignore\n  return {\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postTimestamp: postTimestamp,\n    },\n// @ts-ignore\n    keywords: {\n// @ts-ignore\n      timestamp: timestamp,\n    },\n// @ts-ignore\n    value: new Date(v.value.replace(' ', 'T') + 'Z'),\n// @ts-ignore\n    stringValue: v.stringValue\n  };\n};// @ts-ignore\n\n  var peg$f90 = function(head, tail) {\n// @ts-ignore\n  return makeListMap(tail, 1, head);\n};// @ts-ignore\n\n  var peg$f91 = function(a, b, c) {\n// @ts-ignore\n  if (c) {\n// @ts-ignore\n    return new S.SqlColumn({\n// @ts-ignore\n      refName: c[3],\n// @ts-ignore\n      spacing: {\n// @ts-ignore\n        postTable: c[0],\n// @ts-ignore\n        postDot: c[2],\n      },\n// @ts-ignore\n      table: new S.SqlTable({\n// @ts-ignore\n        refName: b[3],\n// @ts-ignore\n        spacing: {\n// @ts-ignore\n          postNamespace: b[0],\n// @ts-ignore\n          postDot: b[2],\n        },\n// @ts-ignore\n        namespace: new S.SqlNamespace({\n// @ts-ignore\n          refName: a,\n        })\n      })\n    });\n\n// @ts-ignore\n  } else if (b) {\n// @ts-ignore\n    return new S.SqlColumn({\n// @ts-ignore\n      refName: b[3],\n// @ts-ignore\n      spacing: {\n// @ts-ignore\n        postTable: b[0],\n// @ts-ignore\n        postDot: b[2],\n      },\n// @ts-ignore\n      table: new S.SqlTable({\n// @ts-ignore\n        refName: a,\n      })\n    });\n\n// @ts-ignore\n  } else {\n// @ts-ignore\n    return new S.SqlColumn({\n// @ts-ignore\n      refName: a,\n    });\n  }\n};// @ts-ignore\n\n  var peg$f92 = function(a, b) {\n// @ts-ignore\n  if (b) {\n// @ts-ignore\n    return new S.SqlTable({\n// @ts-ignore\n      refName: b[3],\n// @ts-ignore\n      spacing: {\n// @ts-ignore\n        postTable: b[0],\n// @ts-ignore\n        postDot: b[2],\n      },\n// @ts-ignore\n      table: new S.SqlNamespace({\n// @ts-ignore\n        refName: a,\n      })\n    });\n\n// @ts-ignore\n  } else {\n// @ts-ignore\n    return new S.SqlTable({\n// @ts-ignore\n      refName: a,\n    });\n  }\n};// @ts-ignore\n\n  var peg$f93 = function(name) {\n// @ts-ignore\n  return new S.RefName({\n// @ts-ignore\n    name: name.replace(/\"\"/g, '\"'),\n// @ts-ignore\n    quotes: true\n  });\n};// @ts-ignore\n\n  var peg$f94 = function(v) {\n// @ts-ignore\n  return new S.RefName({\n// @ts-ignore\n    name: v.name.replace(/\\\\(\\\\|(?:[0-9a-f]{4}))/gi, function(_, s) { return s === '\\\\' ? '\\\\' : String.fromCharCode(parseInt(s, 16)); }),\n// @ts-ignore\n    quotes: true\n  });\n};// @ts-ignore\n\n  var peg$f95 = function(name) {// @ts-ignore\n return !S.RefName.isReservedKeyword(name) };// @ts-ignore\n\n  var peg$f96 = function(name) {\n// @ts-ignore\n  return new S.RefName({\n// @ts-ignore\n    name: text(),\n// @ts-ignore\n    quotes: false\n  });\n};// @ts-ignore\n\n  var peg$f97 = function(name) {// @ts-ignore\n return !S.RefName.isReservedAlias(name) };// @ts-ignore\n\n  var peg$f98 = function(name) {\n// @ts-ignore\n  return new S.RefName({\n// @ts-ignore\n    name: text(),\n// @ts-ignore\n    quotes: false\n  });\n};// @ts-ignore\n\n  var peg$f99 = function(name) {// @ts-ignore\n return !S.RefName.isReservedFunctionName(name) };// @ts-ignore\n\n  var peg$f100 = function(name) {\n// @ts-ignore\n  return new S.RefName({\n// @ts-ignore\n    name: text(),\n// @ts-ignore\n    quotes: false\n  });\n};// @ts-ignore\n\n  var peg$f101 = function(a, b) {\n// @ts-ignore\n  if (!a) return S.SqlStar.PLAIN;\n\n// @ts-ignore\n  var last = b || a;\n// @ts-ignore\n  return new S.SqlStar({\n// @ts-ignore\n    spacing: {\n// @ts-ignore\n      postTable: last[1],\n// @ts-ignore\n      postDot: last[3],\n    },\n// @ts-ignore\n    table: b ?\n// @ts-ignore\n      new S.SqlTable({\n// @ts-ignore\n        refName: b[0],\n// @ts-ignore\n        spacing: {\n// @ts-ignore\n          postNamespace: a[1],\n// @ts-ignore\n          postDot: a[3],\n        },\n// @ts-ignore\n        namespace: new S.SqlNamespace({\n// @ts-ignore\n          refName: a[0],\n        })\n      }) :\n// @ts-ignore\n      new S.SqlTable({\n// @ts-ignore\n        refName: a[0]\n      })\n  });\n};// @ts-ignore\n\n  var peg$f102 = function() {// @ts-ignore\n return { value: false, stringValue: text() }; };// @ts-ignore\n\n  var peg$f103 = function() {// @ts-ignore\n return { value: null, stringValue: text() }; };// @ts-ignore\n\n  var peg$f104 = function() {// @ts-ignore\n return { value: true, stringValue: text() }; };\n// @ts-ignore\n  var peg$currPos = 0;\n// @ts-ignore\n  var peg$savedPos = 0;\n// @ts-ignore\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n// @ts-ignore\n  var peg$maxFailPos = 0;\n// @ts-ignore\n  var peg$maxFailExpected = [];\n// @ts-ignore\n  var peg$silentFails = 0;\n\n// @ts-ignore\n  var peg$result;\n\n// @ts-ignore\n  if (\"startRule\" in options) {\n// @ts-ignore\n    if (!(options.startRule in peg$startRuleFunctions)) {\n// @ts-ignore\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n// @ts-ignore\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n// @ts-ignore\n  function text() {\n// @ts-ignore\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n// @ts-ignore\n  function offset() {\n// @ts-ignore\n    return peg$savedPos;\n  }\n\n// @ts-ignore\n  function range() {\n// @ts-ignore\n    return {\n// @ts-ignore\n      source: peg$source,\n// @ts-ignore\n      start: peg$savedPos,\n// @ts-ignore\n      end: peg$currPos\n    };\n  }\n\n// @ts-ignore\n  function location() {\n// @ts-ignore\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n// @ts-ignore\n  function expected(description, location) {\n// @ts-ignore\n    location = location !== undefined\n// @ts-ignore\n      ? location\n// @ts-ignore\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n// @ts-ignore\n    throw peg$buildStructuredError(\n// @ts-ignore\n      [peg$otherExpectation(description)],\n// @ts-ignore\n      input.substring(peg$savedPos, peg$currPos),\n// @ts-ignore\n      location\n    );\n  }\n\n// @ts-ignore\n  function error(message, location) {\n// @ts-ignore\n    location = location !== undefined\n// @ts-ignore\n      ? location\n// @ts-ignore\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n// @ts-ignore\n    throw peg$buildSimpleError(message, location);\n  }\n\n// @ts-ignore\n  function peg$literalExpectation(text, ignoreCase) {\n// @ts-ignore\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n// @ts-ignore\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n// @ts-ignore\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n// @ts-ignore\n  function peg$anyExpectation() {\n// @ts-ignore\n    return { type: \"any\" };\n  }\n\n// @ts-ignore\n  function peg$endExpectation() {\n// @ts-ignore\n    return { type: \"end\" };\n  }\n\n// @ts-ignore\n  function peg$otherExpectation(description) {\n// @ts-ignore\n    return { type: \"other\", description: description };\n  }\n\n// @ts-ignore\n  function peg$computePosDetails(pos) {\n// @ts-ignore\n    var details = peg$posDetailsCache[pos];\n// @ts-ignore\n    var p;\n\n// @ts-ignore\n    if (details) {\n// @ts-ignore\n      return details;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      p = pos - 1;\n// @ts-ignore\n      while (!peg$posDetailsCache[p]) {\n// @ts-ignore\n        p--;\n      }\n\n// @ts-ignore\n      details = peg$posDetailsCache[p];\n// @ts-ignore\n      details = {\n// @ts-ignore\n        line: details.line,\n// @ts-ignore\n        column: details.column\n      };\n\n// @ts-ignore\n      while (p < pos) {\n// @ts-ignore\n        if (input.charCodeAt(p) === 10) {\n// @ts-ignore\n          details.line++;\n// @ts-ignore\n          details.column = 1;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          details.column++;\n        }\n\n// @ts-ignore\n        p++;\n      }\n\n// @ts-ignore\n      peg$posDetailsCache[pos] = details;\n\n// @ts-ignore\n      return details;\n    }\n  }\n\n// @ts-ignore\n  function peg$computeLocation(startPos, endPos, offset) {\n// @ts-ignore\n    var startPosDetails = peg$computePosDetails(startPos);\n// @ts-ignore\n    var endPosDetails = peg$computePosDetails(endPos);\n\n// @ts-ignore\n    var res = {\n// @ts-ignore\n      source: peg$source,\n// @ts-ignore\n      start: {\n// @ts-ignore\n        offset: startPos,\n// @ts-ignore\n        line: startPosDetails.line,\n// @ts-ignore\n        column: startPosDetails.column\n      },\n// @ts-ignore\n      end: {\n// @ts-ignore\n        offset: endPos,\n// @ts-ignore\n        line: endPosDetails.line,\n// @ts-ignore\n        column: endPosDetails.column\n      }\n    };\n// @ts-ignore\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n// @ts-ignore\n      res.start = peg$source.offset(res.start);\n// @ts-ignore\n      res.end = peg$source.offset(res.end);\n    }\n// @ts-ignore\n    return res;\n  }\n\n// @ts-ignore\n  function peg$fail(expected) {\n// @ts-ignore\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n// @ts-ignore\n    if (peg$currPos > peg$maxFailPos) {\n// @ts-ignore\n      peg$maxFailPos = peg$currPos;\n// @ts-ignore\n      peg$maxFailExpected = [];\n    }\n\n// @ts-ignore\n    peg$maxFailExpected.push(expected);\n  }\n\n// @ts-ignore\n  function peg$buildSimpleError(message, location) {\n// @ts-ignore\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n// @ts-ignore\n  function peg$buildStructuredError(expected, found, location) {\n// @ts-ignore\n    return new peg$SyntaxError(\n// @ts-ignore\n      peg$SyntaxError.buildMessage(expected, found),\n// @ts-ignore\n      expected,\n// @ts-ignore\n      found,\n// @ts-ignore\n      location\n    );\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseStart() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseSqlQueryWithPossibleContext();\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parseSqlAlias();\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_sc();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f0(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseStartSetStatementsOnly() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = [];\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = peg$parseSqlSetStatement();\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parse_sc();\n// @ts-ignore\n      s4 = [s4, s5];\n// @ts-ignore\n      s3 = s4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s3;\n// @ts-ignore\n      s3 = peg$FAILED;\n    }\n// @ts-ignore\n    while (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2.push(s3);\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseSqlSetStatement();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_sc();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = [];\n// @ts-ignore\n    if (input.length > peg$currPos) {\n// @ts-ignore\n      s5 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s5 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n// @ts-ignore\n    while (s5 !== peg$FAILED) {\n// @ts-ignore\n      s4.push(s5);\n// @ts-ignore\n      if (input.length > peg$currPos) {\n// @ts-ignore\n        s5 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n      }\n    }\n// @ts-ignore\n    s3 = input.substring(s3, peg$currPos);\n// @ts-ignore\n    peg$savedPos = s0;\n// @ts-ignore\n    s0 = peg$f1(s1, s2, s3);\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlAlias() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOrExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseAsToken();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseRefNameAlias();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4, s5];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseSqlColumnList();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f2(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGeneralFunctionArgument() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseSqlLabeledExpression();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseSqlAlias();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlLabeledExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefNameAlias();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c0) {\n// @ts-ignore\n        s3 = peg$c0;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f3(s1, s2, s4, s5);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlKeyValue() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseLongKeyValueForm();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseShortKeyValueForm();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseLongKeyValueForm() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseKeyToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOrExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseValueToken();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseOrExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f4(s1, s2, s3, s4, s5, s6, s7);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseShortKeyValueForm() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOrExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 58) {\n// @ts-ignore\n        s3 = peg$c1;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f5(s1, s2, s4, s5);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlExtendClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseExtendToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$parseOpenParen();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseSqlColumnDeclaration();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = [];\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parseSqlColumnDeclaration();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5.push(s6);\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s8 = peg$parseSqlColumnDeclaration();\n// @ts-ignore\n            if (s8 !== peg$FAILED) {\n// @ts-ignore\n              s7 = [s7, s8];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseCloseParen();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f6(s1, s3, s4, s5, s6);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlColumnDeclaration() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefName();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlType();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f7(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlQueryWithPossibleContext() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = [];\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$parseSqlSetStatement();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parse_sc();\n// @ts-ignore\n      s3 = [s3, s4];\n// @ts-ignore\n      s2 = s3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    while (s2 !== peg$FAILED) {\n// @ts-ignore\n      s1.push(s2);\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parseSqlSetStatement();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_sc();\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    s2 = peg$parseSqlQuery();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f8(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlSetStatement() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSetToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseRefName();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 61) {\n// @ts-ignore\n          s5 = peg$c2;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseSqlLiteral();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s8 = peg$parse_();\n// @ts-ignore\n            if (input.charCodeAt(peg$currPos) === 59) {\n// @ts-ignore\n              s9 = peg$c3;\n// @ts-ignore\n              peg$currPos++;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s9 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              peg$savedPos = s0;\n// @ts-ignore\n              s0 = peg$f9(s1, s2, s3, s4, s6, s7, s8);\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlQuery() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseExplainPlanForToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$parseInsertClause();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s3 = [s3, s4];\n// @ts-ignore\n      s2 = s3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      s2 = null;\n    }\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = peg$parseReplaceClause();\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parse_();\n// @ts-ignore\n      s4 = [s4, s5];\n// @ts-ignore\n      s3 = s4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s3;\n// @ts-ignore\n      s3 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s3 === peg$FAILED) {\n// @ts-ignore\n      s3 = null;\n    }\n// @ts-ignore\n    s4 = peg$currPos;\n// @ts-ignore\n    s5 = peg$currPos;\n// @ts-ignore\n    s6 = peg$parseWithClause();\n// @ts-ignore\n    if (s6 !== peg$FAILED) {\n// @ts-ignore\n      s7 = peg$parse_();\n// @ts-ignore\n      s6 = [s6, s7];\n// @ts-ignore\n      s5 = s6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s5;\n// @ts-ignore\n      s5 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s5 === peg$FAILED) {\n// @ts-ignore\n      s5 = null;\n    }\n// @ts-ignore\n    s6 = peg$parseQueryHeart();\n// @ts-ignore\n    if (s6 !== peg$FAILED) {\n// @ts-ignore\n      s5 = [s5, s6];\n// @ts-ignore\n      s4 = s5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s4;\n// @ts-ignore\n      s4 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s4 === peg$FAILED) {\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parseWithClause();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseOpenParen();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parse_();\n// @ts-ignore\n          s9 = peg$parseSqlQuery();\n// @ts-ignore\n          if (s9 !== peg$FAILED) {\n// @ts-ignore\n            s10 = peg$parse_();\n// @ts-ignore\n            s11 = peg$parseCloseParen();\n// @ts-ignore\n            if (s11 !== peg$FAILED) {\n// @ts-ignore\n              s5 = [s5, s6, s7, s8, s9, s10, s11];\n// @ts-ignore\n              s4 = s5;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s4;\n// @ts-ignore\n              s4 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s4;\n// @ts-ignore\n            s4 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      s6 = peg$parse_();\n// @ts-ignore\n      s7 = peg$parseOrderByClause();\n// @ts-ignore\n      if (s7 !== peg$FAILED) {\n// @ts-ignore\n        s6 = [s6, s7];\n// @ts-ignore\n        s5 = s6;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s5;\n// @ts-ignore\n        s5 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = null;\n      }\n// @ts-ignore\n      s6 = peg$currPos;\n// @ts-ignore\n      s7 = peg$parse_();\n// @ts-ignore\n      s8 = peg$parseLimitClause();\n// @ts-ignore\n      if (s8 !== peg$FAILED) {\n// @ts-ignore\n        s7 = [s7, s8];\n// @ts-ignore\n        s6 = s7;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s6;\n// @ts-ignore\n        s6 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s6 === peg$FAILED) {\n// @ts-ignore\n        s6 = null;\n      }\n// @ts-ignore\n      s7 = peg$currPos;\n// @ts-ignore\n      s8 = peg$parse_();\n// @ts-ignore\n      s9 = peg$parseOffsetClause();\n// @ts-ignore\n      if (s9 !== peg$FAILED) {\n// @ts-ignore\n        s8 = [s8, s9];\n// @ts-ignore\n        s7 = s8;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s7;\n// @ts-ignore\n        s7 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s7 === peg$FAILED) {\n// @ts-ignore\n        s7 = null;\n      }\n// @ts-ignore\n      s8 = peg$currPos;\n// @ts-ignore\n      s9 = peg$parse_();\n// @ts-ignore\n      s10 = peg$parsePartitionedByClause();\n// @ts-ignore\n      if (s10 !== peg$FAILED) {\n// @ts-ignore\n        s9 = [s9, s10];\n// @ts-ignore\n        s8 = s9;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s8;\n// @ts-ignore\n        s8 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s8 === peg$FAILED) {\n// @ts-ignore\n        s8 = null;\n      }\n// @ts-ignore\n      s9 = peg$currPos;\n// @ts-ignore\n      s10 = peg$parse_();\n// @ts-ignore\n      s11 = peg$parseClusteredByClause();\n// @ts-ignore\n      if (s11 !== peg$FAILED) {\n// @ts-ignore\n        s10 = [s10, s11];\n// @ts-ignore\n        s9 = s10;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s9;\n// @ts-ignore\n        s9 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s9 === peg$FAILED) {\n// @ts-ignore\n        s9 = null;\n      }\n// @ts-ignore\n      s10 = peg$currPos;\n// @ts-ignore\n      s11 = peg$parse_();\n// @ts-ignore\n      s12 = peg$parseUnionClause();\n// @ts-ignore\n      if (s12 !== peg$FAILED) {\n// @ts-ignore\n        s11 = [s11, s12];\n// @ts-ignore\n        s10 = s11;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s10;\n// @ts-ignore\n        s10 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s10 === peg$FAILED) {\n// @ts-ignore\n        s10 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f10(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseQueryHeart() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSelectClause();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseFromClause();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseSqlWhereClause();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parse_();\n// @ts-ignore\n      s6 = peg$parseGroupByClause();\n// @ts-ignore\n      if (s6 !== peg$FAILED) {\n// @ts-ignore\n        s5 = [s5, s6];\n// @ts-ignore\n        s4 = s5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = null;\n      }\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      s6 = peg$parse_();\n// @ts-ignore\n      s7 = peg$parseHavingClause();\n// @ts-ignore\n      if (s7 !== peg$FAILED) {\n// @ts-ignore\n        s6 = [s6, s7];\n// @ts-ignore\n        s5 = s6;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s5;\n// @ts-ignore\n        s5 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f11(s1, s2, s3, s4, s5);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseInsertClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseInsertToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse__();\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseIntoToken();\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          s4 = peg$parse__();\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s5 = peg$parseGenericFunction();\n// @ts-ignore\n            if (s5 === peg$FAILED) {\n// @ts-ignore\n              s5 = peg$parseSqlTable();\n            }\n// @ts-ignore\n            if (s5 !== peg$FAILED) {\n// @ts-ignore\n              s6 = peg$currPos;\n// @ts-ignore\n              s7 = peg$parse_();\n// @ts-ignore\n              s8 = peg$parseSqlColumnList();\n// @ts-ignore\n              if (s8 !== peg$FAILED) {\n// @ts-ignore\n                s7 = [s7, s8];\n// @ts-ignore\n                s6 = s7;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s6;\n// @ts-ignore\n                s6 = peg$FAILED;\n              }\n// @ts-ignore\n              if (s6 === peg$FAILED) {\n// @ts-ignore\n                s6 = null;\n              }\n// @ts-ignore\n              s7 = peg$currPos;\n// @ts-ignore\n              s8 = peg$parse_();\n// @ts-ignore\n              s9 = peg$parseAsToken();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                s10 = peg$parse_();\n// @ts-ignore\n                s11 = peg$parseCsvToken();\n// @ts-ignore\n                if (s11 !== peg$FAILED) {\n// @ts-ignore\n                  s8 = [s8, s9, s10, s11];\n// @ts-ignore\n                  s7 = s8;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  peg$currPos = s7;\n// @ts-ignore\n                  s7 = peg$FAILED;\n                }\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s7;\n// @ts-ignore\n                s7 = peg$FAILED;\n              }\n// @ts-ignore\n              if (s7 === peg$FAILED) {\n// @ts-ignore\n                s7 = null;\n              }\n// @ts-ignore\n              peg$savedPos = s0;\n// @ts-ignore\n              s0 = peg$f12(s1, s2, s3, s4, s5, s6, s7);\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseReplaceClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseReplaceToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse__();\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseIntoToken();\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          s4 = peg$parse__();\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s5 = peg$parseSqlTable();\n// @ts-ignore\n            if (s5 !== peg$FAILED) {\n// @ts-ignore\n              s6 = peg$currPos;\n// @ts-ignore\n              s7 = peg$parse_();\n// @ts-ignore\n              s8 = peg$parseSqlColumnList();\n// @ts-ignore\n              if (s8 !== peg$FAILED) {\n// @ts-ignore\n                s7 = [s7, s8];\n// @ts-ignore\n                s6 = s7;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s6;\n// @ts-ignore\n                s6 = peg$FAILED;\n              }\n// @ts-ignore\n              if (s6 === peg$FAILED) {\n// @ts-ignore\n                s6 = null;\n              }\n// @ts-ignore\n              s7 = peg$parse__();\n// @ts-ignore\n              if (s7 !== peg$FAILED) {\n// @ts-ignore\n                s8 = peg$parseOverwriteToken();\n// @ts-ignore\n                if (s8 !== peg$FAILED) {\n// @ts-ignore\n                  s9 = peg$parse__();\n// @ts-ignore\n                  if (s9 !== peg$FAILED) {\n// @ts-ignore\n                    s10 = peg$parseAllToken();\n// @ts-ignore\n                    if (s10 === peg$FAILED) {\n// @ts-ignore\n                      s10 = peg$parseSqlWhereClause();\n                    }\n// @ts-ignore\n                    if (s10 !== peg$FAILED) {\n// @ts-ignore\n                      peg$savedPos = s0;\n// @ts-ignore\n                      s0 = peg$f13(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);\n// @ts-ignore\n                    } else {\n// @ts-ignore\n                      peg$currPos = s0;\n// @ts-ignore\n                      s0 = peg$FAILED;\n                    }\n// @ts-ignore\n                  } else {\n// @ts-ignore\n                    peg$currPos = s0;\n// @ts-ignore\n                    s0 = peg$FAILED;\n                  }\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  peg$currPos = s0;\n// @ts-ignore\n                  s0 = peg$FAILED;\n                }\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseWithClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseWithToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlWithPart();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseSqlWithPart();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseSqlWithPart();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f14(s1, s2, s3, s4);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlWithPart() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefName();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseSqlColumnList();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$parseAsToken();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseSqlQueryInParens();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f15(s1, s2, s3, s4, s5, s6);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlColumnList() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOpenParen();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseRefName();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseRefName();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseRefName();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseCloseParen();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f16(s2, s3, s4, s5);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSelectClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSelectToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseAllToken();\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseDistinctToken();\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$parseSqlStarOrAliasExpression();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = [];\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parseSqlStarOrAliasExpression();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5.push(s6);\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s8 = peg$parseSqlStarOrAliasExpression();\n// @ts-ignore\n            if (s8 !== peg$FAILED) {\n// @ts-ignore\n              s7 = [s7, s8];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f17(s1, s2, s3, s4, s5);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlStarOrAliasExpression() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseSqlStar();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseSqlAlias();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFromClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseFromToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlAlias();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseSqlAlias();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseSqlAlias();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseJoinClauses();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6 = [s6, s7];\n// @ts-ignore\n          s5 = s6;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f18(s1, s2, s3, s4, s5);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJoinClauses() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSqlJoinPart();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseSqlJoinPart();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseSqlJoinPart();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f19(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlJoinPart() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseNaturalToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$parseJoinType();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s3 = [s3, s4];\n// @ts-ignore\n      s2 = s3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      s2 = null;\n    }\n// @ts-ignore\n    s3 = peg$parseJoinToken();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseSqlAlias();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseOnToken();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$parse_();\n// @ts-ignore\n          s10 = peg$parseOrExpression();\n// @ts-ignore\n          if (s10 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8, s9, s10];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseUsingToken();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parse_();\n// @ts-ignore\n            s10 = peg$parseSqlColumnList();\n// @ts-ignore\n            if (s10 !== peg$FAILED) {\n// @ts-ignore\n              s7 = [s7, s8, s9, s10];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s6 = null;\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f20(s1, s2, s3, s4, s5, s6);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJoinType() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c4) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c5) {\n// @ts-ignore\n        s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n        peg$currPos += 5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c6) {\n// @ts-ignore\n          s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n          peg$currPos += 4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s2 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse__();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parseOuterToken();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c7) {\n// @ts-ignore\n        s0 = input.substr(peg$currPos, 5);\n// @ts-ignore\n        peg$currPos += 5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s0 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 5).toLowerCase() === peg$c8) {\n// @ts-ignore\n          s0 = input.substr(peg$currPos, 5);\n// @ts-ignore\n          peg$currPos += 5;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s0 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlWhereClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseWhereToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOrExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f21(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGroupByClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseGroupByToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseRollupToken();\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseCubeToken();\n// @ts-ignore\n        if (s4 === peg$FAILED) {\n// @ts-ignore\n          s4 = peg$parseGroupingSetsToken();\n        }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parseOpenParen();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$currPos;\n// @ts-ignore\n        s8 = peg$parseGroupByExpressionList();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$parse_();\n// @ts-ignore\n          s8 = [s8, s9];\n// @ts-ignore\n          s7 = s8;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s7;\n// @ts-ignore\n          s7 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s7 === peg$FAILED) {\n// @ts-ignore\n          s7 = null;\n        }\n// @ts-ignore\n        s8 = peg$parseCloseParen();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s5 = [s5, s6, s7, s8];\n// @ts-ignore\n          s4 = s5;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseGroupByExpressionList();\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f22(s1, s2, s3, s4);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGroupByExpressionList() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseGroupByExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseCommaSeparator();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parseGroupByExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$parseGroupByExpression();\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f23(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGroupByExpression() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseSqlEmptyRecord();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseOrExpression();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlEmptyRecord() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOpenParen();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseCloseParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f24(s2);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseHavingClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseHavingToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOrExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f25(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOrderByClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOrderByToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlOrderByExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseSqlOrderByExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseSqlOrderByExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f26(s1, s2, s3, s4);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlOrderByExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOrExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseAscToken();\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseDescToken();\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f27(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseLimitClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseLimitToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlLiteral();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f28(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOffsetClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOffsetToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlLiteral();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f29(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePartitionedByClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parsePartitionedByToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseTimeUnitLiteral();\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseOrExpression();\n// @ts-ignore\n        if (s3 === peg$FAILED) {\n// @ts-ignore\n          s3 = peg$currPos;\n// @ts-ignore\n          s4 = peg$parseAllToken();\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s5 = peg$currPos;\n// @ts-ignore\n            s6 = peg$parse__();\n// @ts-ignore\n            if (s6 !== peg$FAILED) {\n// @ts-ignore\n              s7 = peg$parseTimeToken();\n// @ts-ignore\n              if (s7 !== peg$FAILED) {\n// @ts-ignore\n                s6 = [s6, s7];\n// @ts-ignore\n                s5 = s6;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s5;\n// @ts-ignore\n                s5 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n            if (s5 === peg$FAILED) {\n// @ts-ignore\n              s5 = null;\n            }\n// @ts-ignore\n            s4 = [s4, s5];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n        }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f30(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseClusteredByClause() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseClusteredByToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOrExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseOrExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseOrExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f31(s1, s2, s3, s4);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnionClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnionAllToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlQuery();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f32(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOrExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseAndExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseOrToken();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseAndExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrToken();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseAndExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f33(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAndExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseNotExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$parseAndToken();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseNotExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseAndToken();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseNotExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f34(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNotExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseNotToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseNotExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f35(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseComparisonExpression();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseAdditionExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseComparisonOpRhs();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f36(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhs() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseComparisonOpRhsCompare();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseComparisonOpRhsIs();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseComparisonOpRhsIn();\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          s0 = peg$parseComparisonOpRhsBetween();\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            s0 = peg$parseComparisonOpRhsLike();\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhsCompare() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseComparisonOperator();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseAdditionExpression();\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parseComparisonDecorator();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$parse_();\n// @ts-ignore\n          s6 = peg$parseSqlQueryInParens();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f37(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOperator() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 61) {\n// @ts-ignore\n      s0 = peg$c2;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c9) {\n// @ts-ignore\n        s0 = peg$c9;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s0 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2) === peg$c10) {\n// @ts-ignore\n          s0 = peg$c10;\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s0 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          if (input.substr(peg$currPos, 2) === peg$c11) {\n// @ts-ignore\n            s0 = peg$c11;\n// @ts-ignore\n            peg$currPos += 2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s0 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            if (input.substr(peg$currPos, 2) === peg$c12) {\n// @ts-ignore\n              s0 = peg$c12;\n// @ts-ignore\n              peg$currPos += 2;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s0 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e13); }\n            }\n// @ts-ignore\n            if (s0 === peg$FAILED) {\n// @ts-ignore\n              if (input.charCodeAt(peg$currPos) === 60) {\n// @ts-ignore\n                s0 = peg$c13;\n// @ts-ignore\n                peg$currPos++;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                s0 = peg$FAILED;\n// @ts-ignore\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n// @ts-ignore\n              if (s0 === peg$FAILED) {\n// @ts-ignore\n                if (input.charCodeAt(peg$currPos) === 62) {\n// @ts-ignore\n                  s0 = peg$c14;\n// @ts-ignore\n                  peg$currPos++;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  s0 = peg$FAILED;\n// @ts-ignore\n                  if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonDecorator() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseAnyToken();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseAllToken();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseSomeToken();\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhsIs() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseIsToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parse__();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parseNotToken();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5 = [s5, s6];\n// @ts-ignore\n          s4 = s5;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = null;\n      }\n// @ts-ignore\n      s3 = input.substring(s3, peg$currPos);\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      s6 = peg$parse__();\n// @ts-ignore\n      if (s6 !== peg$FAILED) {\n// @ts-ignore\n        s7 = peg$parseDistinctToken();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parse__();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parseFromToken();\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7, s8, s9];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s5;\n// @ts-ignore\n        s5 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = null;\n      }\n// @ts-ignore\n      s4 = input.substring(s4, peg$currPos);\n// @ts-ignore\n      s2 = [s2, s3, s4];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseAdditionExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f38(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhsIn() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = peg$parseNotToken();\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parse__();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s3;\n// @ts-ignore\n      s3 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s3 === peg$FAILED) {\n// @ts-ignore\n      s3 = null;\n    }\n// @ts-ignore\n    s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n    s3 = peg$parseInToken();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlQueryInParens();\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseSqlRecord();\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f39(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhsBetween() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = peg$parseNotToken();\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parse__();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s3;\n// @ts-ignore\n      s3 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s3 === peg$FAILED) {\n// @ts-ignore\n      s3 = null;\n    }\n// @ts-ignore\n    s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n    s3 = peg$parseBetweenToken();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseSymmetricToken();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$parseAdditionExpression();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseAndToken();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseAdditionExpression();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f40(s1, s2, s3, s4, s5, s6, s7, s8);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseComparisonOpRhsLike() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$currPos;\n// @ts-ignore\n    s4 = peg$parseNotToken();\n// @ts-ignore\n    if (s4 !== peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parse__();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s3;\n// @ts-ignore\n      s3 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s3 === peg$FAILED) {\n// @ts-ignore\n      s3 = null;\n    }\n// @ts-ignore\n    s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n    s3 = peg$parseLikeToken();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseAdditionExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$currPos;\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseEscapeToken();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseAdditionExpression();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s5 = [s5, s6, s7, s8];\n// @ts-ignore\n            s4 = s5;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s4;\n// @ts-ignore\n            s4 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s4 === peg$FAILED) {\n// @ts-ignore\n          s4 = null;\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f41(s1, s2, s3, s4);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAdditionExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSubtractionExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 43) {\n// @ts-ignore\n        s5 = peg$c15;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseSubtractionExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 43) {\n// @ts-ignore\n          s5 = peg$c15;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseSubtractionExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f42(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSubtractionExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseMultiplicationExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      s6 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 45) {\n// @ts-ignore\n        s7 = peg$c16;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s7 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n// @ts-ignore\n      if (s7 !== peg$FAILED) {\n// @ts-ignore\n        s8 = peg$currPos;\n// @ts-ignore\n        peg$silentFails++;\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 45) {\n// @ts-ignore\n          s9 = peg$c16;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s9 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n// @ts-ignore\n        peg$silentFails--;\n// @ts-ignore\n        if (s9 === peg$FAILED) {\n// @ts-ignore\n          s8 = undefined;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s8;\n// @ts-ignore\n          s8 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s7 = [s7, s8];\n// @ts-ignore\n          s6 = s7;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s6;\n// @ts-ignore\n        s6 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s6 !== peg$FAILED) {\n// @ts-ignore\n        s5 = input.substring(s5, peg$currPos);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = s6;\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseMultiplicationExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 45) {\n// @ts-ignore\n          s7 = peg$c16;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s7 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 45) {\n// @ts-ignore\n            s9 = peg$c16;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s9 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n          }\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s9 === peg$FAILED) {\n// @ts-ignore\n            s8 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s8;\n// @ts-ignore\n            s8 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5 = input.substring(s5, peg$currPos);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = s6;\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseMultiplicationExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f43(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseMultiplicationExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseDivisionExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 42) {\n// @ts-ignore\n        s5 = peg$c17;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseDivisionExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 42) {\n// @ts-ignore\n          s5 = peg$c17;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseDivisionExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f44(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDivisionExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnaryExpression();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 47) {\n// @ts-ignore\n        s5 = peg$c18;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseUnaryExpression();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 47) {\n// @ts-ignore\n          s5 = peg$c18;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseUnaryExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f45(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnaryExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (peg$r0.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s1 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseNumber();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseConcatExpression();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f46(s1, s2, s4);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseConcatExpression();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseConcatExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseBaseType();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c19) {\n// @ts-ignore\n        s5 = peg$c19;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseBaseType();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.substr(peg$currPos, 2) === peg$c19) {\n// @ts-ignore\n          s5 = peg$c19;\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseBaseType();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f47(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseBaseType() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseSqlPlaceholder();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseInterval();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseCaseExpression();\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          s0 = peg$parseFunction();\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            s0 = peg$parseSqlValues();\n// @ts-ignore\n            if (s0 === peg$FAILED) {\n// @ts-ignore\n              s0 = peg$parseSqlLiteral();\n// @ts-ignore\n              if (s0 === peg$FAILED) {\n// @ts-ignore\n                s0 = peg$parseSqlColumn();\n// @ts-ignore\n                if (s0 === peg$FAILED) {\n// @ts-ignore\n                  s0 = peg$parseSqlRecordOrExpressionInParens();\n// @ts-ignore\n                  if (s0 === peg$FAILED) {\n// @ts-ignore\n                    s0 = peg$parseSqlQueryInParens();\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCaseExpression() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseCaseToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseOrExpression();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$parseSqlWhenThenPart();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = [];\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseSqlWhenThenPart();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s7 = [s7, s8];\n// @ts-ignore\n          s6 = s7;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5.push(s6);\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseSqlWhenThenPart();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseElseToken();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$parse_();\n// @ts-ignore\n          s10 = peg$parseOrExpression();\n// @ts-ignore\n          if (s10 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8, s9, s10];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s6 = null;\n        }\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseEndToken();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f48(s1, s2, s3, s4, s5, s6, s7, s8);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlWhenThenPart() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseWhenToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOrExpression();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseOrExpression();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseOrExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseThenToken();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseOrExpression();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f49(s1, s2, s3, s4, s5, s6, s7, s8);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseInterval() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseIntervalToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseBaseType();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parseTimeUnit();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parse_();\n// @ts-ignore\n          s9 = peg$parseToToken();\n// @ts-ignore\n          if (s9 !== peg$FAILED) {\n// @ts-ignore\n            s10 = peg$parse_();\n// @ts-ignore\n            s11 = peg$parseTimeUnit();\n// @ts-ignore\n            if (s11 !== peg$FAILED) {\n// @ts-ignore\n              s7 = [s7, s8, s9, s10, s11];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5 = input.substring(s5, peg$currPos);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = s6;\n        }\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parseTimeUnit();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            if (input.charCodeAt(peg$currPos) === 95) {\n// @ts-ignore\n              s8 = peg$c20;\n// @ts-ignore\n              peg$currPos++;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s8 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e22); }\n            }\n// @ts-ignore\n            if (s8 !== peg$FAILED) {\n// @ts-ignore\n              s9 = peg$parseTimeUnit();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                s7 = [s7, s8, s9];\n// @ts-ignore\n                s6 = s7;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s6;\n// @ts-ignore\n                s6 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s5 = input.substring(s5, peg$currPos);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s5 = s6;\n          }\n// @ts-ignore\n          if (s5 === peg$FAILED) {\n// @ts-ignore\n            s5 = peg$currPos;\n// @ts-ignore\n            s6 = peg$currPos;\n// @ts-ignore\n            s7 = peg$parseTimeUnit();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              if (input.substr(peg$currPos, 1).toLowerCase() === peg$c21) {\n// @ts-ignore\n                s8 = input.charAt(peg$currPos);\n// @ts-ignore\n                peg$currPos++;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                s8 = peg$FAILED;\n// @ts-ignore\n                if (peg$silentFails === 0) { peg$fail(peg$e23); }\n              }\n// @ts-ignore\n              if (s8 === peg$FAILED) {\n// @ts-ignore\n                s8 = null;\n              }\n// @ts-ignore\n              s7 = [s7, s8];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n            if (s6 !== peg$FAILED) {\n// @ts-ignore\n              s5 = input.substring(s5, peg$currPos);\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s5 = s6;\n            }\n          }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f50(s1, s2, s3, s4, s5);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimeUnitLiteral() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseTimeUnit();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f51(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimeUnit() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c22) {\n// @ts-ignore\n      s0 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      if (input.substr(peg$currPos, 6).toLowerCase() === peg$c23) {\n// @ts-ignore\n        s0 = input.substr(peg$currPos, 6);\n// @ts-ignore\n        peg$currPos += 6;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s0 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c24) {\n// @ts-ignore\n          s0 = input.substr(peg$currPos, 4);\n// @ts-ignore\n          peg$currPos += 4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s0 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          if (input.substr(peg$currPos, 3).toLowerCase() === peg$c25) {\n// @ts-ignore\n            s0 = input.substr(peg$currPos, 3);\n// @ts-ignore\n            peg$currPos += 3;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s0 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e27); }\n          }\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c26) {\n// @ts-ignore\n              s0 = input.substr(peg$currPos, 4);\n// @ts-ignore\n              peg$currPos += 4;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s0 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e28); }\n            }\n// @ts-ignore\n            if (s0 === peg$FAILED) {\n// @ts-ignore\n              if (input.substr(peg$currPos, 5).toLowerCase() === peg$c27) {\n// @ts-ignore\n                s0 = input.substr(peg$currPos, 5);\n// @ts-ignore\n                peg$currPos += 5;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                s0 = peg$FAILED;\n// @ts-ignore\n                if (peg$silentFails === 0) { peg$fail(peg$e29); }\n              }\n// @ts-ignore\n              if (s0 === peg$FAILED) {\n// @ts-ignore\n                if (input.substr(peg$currPos, 7).toLowerCase() === peg$c28) {\n// @ts-ignore\n                  s0 = input.substr(peg$currPos, 7);\n// @ts-ignore\n                  peg$currPos += 7;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  s0 = peg$FAILED;\n// @ts-ignore\n                  if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                }\n// @ts-ignore\n                if (s0 === peg$FAILED) {\n// @ts-ignore\n                  if (input.substr(peg$currPos, 4).toLowerCase() === peg$c29) {\n// @ts-ignore\n                    s0 = input.substr(peg$currPos, 4);\n// @ts-ignore\n                    peg$currPos += 4;\n// @ts-ignore\n                  } else {\n// @ts-ignore\n                    s0 = peg$FAILED;\n// @ts-ignore\n                    if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimeUnitExtra() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseTimeUnit();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c30) {\n// @ts-ignore\n        s0 = input.substr(peg$currPos, 5);\n// @ts-ignore\n        peg$currPos += 5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s0 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 11).toLowerCase() === peg$c31) {\n// @ts-ignore\n          s0 = input.substr(peg$currPos, 11);\n// @ts-ignore\n          peg$currPos += 11;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s0 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          if (input.substr(peg$currPos, 11).toLowerCase() === peg$c32) {\n// @ts-ignore\n            s0 = input.substr(peg$currPos, 11);\n// @ts-ignore\n            peg$currPos += 11;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s0 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e34); }\n          }\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            if (input.substr(peg$currPos, 3).toLowerCase() === peg$c33) {\n// @ts-ignore\n              s0 = input.substr(peg$currPos, 3);\n// @ts-ignore\n              peg$currPos += 3;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s0 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e35); }\n            }\n// @ts-ignore\n            if (s0 === peg$FAILED) {\n// @ts-ignore\n              if (input.substr(peg$currPos, 6).toLowerCase() === peg$c34) {\n// @ts-ignore\n                s0 = input.substr(peg$currPos, 6);\n// @ts-ignore\n                peg$currPos += 6;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                s0 = peg$FAILED;\n// @ts-ignore\n                if (peg$silentFails === 0) { peg$fail(peg$e36); }\n              }\n// @ts-ignore\n              if (s0 === peg$FAILED) {\n// @ts-ignore\n                if (input.substr(peg$currPos, 3).toLowerCase() === peg$c35) {\n// @ts-ignore\n                  s0 = input.substr(peg$currPos, 3);\n// @ts-ignore\n                  peg$currPos += 3;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  s0 = peg$FAILED;\n// @ts-ignore\n                  if (peg$silentFails === 0) { peg$fail(peg$e37); }\n                }\n// @ts-ignore\n                if (s0 === peg$FAILED) {\n// @ts-ignore\n                  if (input.substr(peg$currPos, 7).toLowerCase() === peg$c36) {\n// @ts-ignore\n                    s0 = input.substr(peg$currPos, 7);\n// @ts-ignore\n                    peg$currPos += 7;\n// @ts-ignore\n                  } else {\n// @ts-ignore\n                    s0 = peg$FAILED;\n// @ts-ignore\n                    if (peg$silentFails === 0) { peg$fail(peg$e38); }\n                  }\n// @ts-ignore\n                  if (s0 === peg$FAILED) {\n// @ts-ignore\n                    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c37) {\n// @ts-ignore\n                      s0 = input.substr(peg$currPos, 6);\n// @ts-ignore\n                      peg$currPos += 6;\n// @ts-ignore\n                    } else {\n// @ts-ignore\n                      s0 = peg$FAILED;\n// @ts-ignore\n                      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n                    }\n// @ts-ignore\n                    if (s0 === peg$FAILED) {\n// @ts-ignore\n                      if (input.substr(peg$currPos, 7).toLowerCase() === peg$c38) {\n// @ts-ignore\n                        s0 = input.substr(peg$currPos, 7);\n// @ts-ignore\n                        peg$currPos += 7;\n// @ts-ignore\n                      } else {\n// @ts-ignore\n                        s0 = peg$FAILED;\n// @ts-ignore\n                        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n                      }\n// @ts-ignore\n                      if (s0 === peg$FAILED) {\n// @ts-ignore\n                        if (input.substr(peg$currPos, 10).toLowerCase() === peg$c39) {\n// @ts-ignore\n                          s0 = input.substr(peg$currPos, 10);\n// @ts-ignore\n                          peg$currPos += 10;\n// @ts-ignore\n                        } else {\n// @ts-ignore\n                          s0 = peg$FAILED;\n// @ts-ignore\n                          if (peg$silentFails === 0) { peg$fail(peg$e41); }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFunction() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseCastFunction();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseGenericFunction();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseCountStarFunction();\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          s0 = peg$parseExtractFunction();\n// @ts-ignore\n          if (s0 === peg$FAILED) {\n// @ts-ignore\n            s0 = peg$parseTrimFunction();\n// @ts-ignore\n            if (s0 === peg$FAILED) {\n// @ts-ignore\n              s0 = peg$parseFloorCeilFunction();\n// @ts-ignore\n              if (s0 === peg$FAILED) {\n// @ts-ignore\n                s0 = peg$parseTimestampAddDiffFunction();\n// @ts-ignore\n                if (s0 === peg$FAILED) {\n// @ts-ignore\n                  s0 = peg$parsePositionFunction();\n// @ts-ignore\n                  if (s0 === peg$FAILED) {\n// @ts-ignore\n                    s0 = peg$parseJsonValueReturningFunction();\n// @ts-ignore\n                    if (s0 === peg$FAILED) {\n// @ts-ignore\n                      s0 = peg$parseJsonObjectFunction();\n// @ts-ignore\n                      if (s0 === peg$FAILED) {\n// @ts-ignore\n                        s0 = peg$parseArrayFunction();\n// @ts-ignore\n                        if (s0 === peg$FAILED) {\n// @ts-ignore\n                          s0 = peg$parseNakedFunction();\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGenericFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefNameFunction();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s4 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseRefNameFunction();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s3 = [s3, s4, s5, s6];\n// @ts-ignore\n          s2 = s3;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s2;\n// @ts-ignore\n          s2 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseOpenParen();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parseFunctionDecorator();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parse_();\n// @ts-ignore\n          s7 = [s7, s8];\n// @ts-ignore\n          s6 = s7;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s6 = null;\n        }\n// @ts-ignore\n        s7 = peg$parseGeneralFunctionArgument();\n// @ts-ignore\n        if (s7 === peg$FAILED) {\n// @ts-ignore\n          s7 = null;\n        }\n// @ts-ignore\n        s8 = [];\n// @ts-ignore\n        s9 = peg$currPos;\n// @ts-ignore\n        s10 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s10 !== peg$FAILED) {\n// @ts-ignore\n          s11 = peg$parseGeneralFunctionArgument();\n// @ts-ignore\n          if (s11 !== peg$FAILED) {\n// @ts-ignore\n            s10 = [s10, s11];\n// @ts-ignore\n            s9 = s10;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s9;\n// @ts-ignore\n            s9 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s9;\n// @ts-ignore\n          s9 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s9 !== peg$FAILED) {\n// @ts-ignore\n          s8.push(s9);\n// @ts-ignore\n          s9 = peg$currPos;\n// @ts-ignore\n          s10 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s10 !== peg$FAILED) {\n// @ts-ignore\n            s11 = peg$parseGeneralFunctionArgument();\n// @ts-ignore\n            if (s11 !== peg$FAILED) {\n// @ts-ignore\n              s10 = [s10, s11];\n// @ts-ignore\n              s9 = s10;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s9;\n// @ts-ignore\n              s9 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s9;\n// @ts-ignore\n            s9 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s9 = peg$parse_();\n// @ts-ignore\n        s10 = peg$parseCloseParen();\n// @ts-ignore\n        if (s10 !== peg$FAILED) {\n// @ts-ignore\n          s11 = peg$currPos;\n// @ts-ignore\n          s12 = peg$parse_();\n// @ts-ignore\n          s13 = peg$parseFunctionFilter();\n// @ts-ignore\n          if (s13 !== peg$FAILED) {\n// @ts-ignore\n            s12 = [s12, s13];\n// @ts-ignore\n            s11 = s12;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s11;\n// @ts-ignore\n            s11 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s11 === peg$FAILED) {\n// @ts-ignore\n            s11 = null;\n          }\n// @ts-ignore\n          s12 = peg$currPos;\n// @ts-ignore\n          s13 = peg$parse_();\n// @ts-ignore\n          s14 = peg$parseOverToken();\n// @ts-ignore\n          if (s14 !== peg$FAILED) {\n// @ts-ignore\n            s15 = peg$parse_();\n// @ts-ignore\n            s16 = peg$parseWindowSpec();\n// @ts-ignore\n            if (s16 !== peg$FAILED) {\n// @ts-ignore\n              s13 = [s13, s14, s15, s16];\n// @ts-ignore\n              s12 = s13;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s12;\n// @ts-ignore\n              s12 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s12;\n// @ts-ignore\n            s12 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s12 === peg$FAILED) {\n// @ts-ignore\n            s12 = null;\n          }\n// @ts-ignore\n          s13 = peg$currPos;\n// @ts-ignore\n          s14 = peg$parse_();\n// @ts-ignore\n          s15 = peg$parseSqlExtendClause();\n// @ts-ignore\n          if (s15 !== peg$FAILED) {\n// @ts-ignore\n            s14 = [s14, s15];\n// @ts-ignore\n            s13 = s14;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s13;\n// @ts-ignore\n            s13 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s13 === peg$FAILED) {\n// @ts-ignore\n            s13 = null;\n          }\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f52(s1, s2, s3, s5, s6, s7, s8, s9, s11, s12, s13);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNakedFunction() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnquotedRefNameFree();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = peg$currPos;\n// @ts-ignore\n      s2 = peg$f53(s1);\n// @ts-ignore\n      if (s2) {\n// @ts-ignore\n        s2 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f54(s1);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCountStarFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseCountToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n        s2 = peg$c41;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseCountToken();\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n            s4 = peg$c41;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e43); }\n          }\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 42) {\n// @ts-ignore\n          s5 = peg$c17;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseCloseParen();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s8 = peg$currPos;\n// @ts-ignore\n            s9 = peg$parse_();\n// @ts-ignore\n            s10 = peg$parseFunctionFilter();\n// @ts-ignore\n            if (s10 !== peg$FAILED) {\n// @ts-ignore\n              s9 = [s9, s10];\n// @ts-ignore\n              s8 = s9;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s8;\n// @ts-ignore\n              s8 = peg$FAILED;\n            }\n// @ts-ignore\n            if (s8 === peg$FAILED) {\n// @ts-ignore\n              s8 = null;\n            }\n// @ts-ignore\n            s9 = peg$currPos;\n// @ts-ignore\n            s10 = peg$parse_();\n// @ts-ignore\n            s11 = peg$parseOverToken();\n// @ts-ignore\n            if (s11 !== peg$FAILED) {\n// @ts-ignore\n              s12 = peg$parse_();\n// @ts-ignore\n              s13 = peg$parseWindowSpec();\n// @ts-ignore\n              if (s13 !== peg$FAILED) {\n// @ts-ignore\n                s10 = [s10, s11, s12, s13];\n// @ts-ignore\n                s9 = s10;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s9;\n// @ts-ignore\n                s9 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s9;\n// @ts-ignore\n              s9 = peg$FAILED;\n            }\n// @ts-ignore\n            if (s9 === peg$FAILED) {\n// @ts-ignore\n              s9 = null;\n            }\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f55(s1, s2, s4, s6, s8, s9);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCastFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseCastToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parseAsSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseSqlType();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s8 = peg$parse_();\n// @ts-ignore\n              s9 = peg$parseCloseParen();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                peg$savedPos = s0;\n// @ts-ignore\n                s0 = peg$f56(s1, s2, s4, s5, s6, s7, s8);\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJsonValueReturningFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseJsonValueToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseOrExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s8 = peg$parseReturningSeparator();\n// @ts-ignore\n              if (s8 !== peg$FAILED) {\n// @ts-ignore\n                s9 = peg$parseSqlType();\n// @ts-ignore\n                if (s9 !== peg$FAILED) {\n// @ts-ignore\n                  s10 = peg$parse_();\n// @ts-ignore\n                  s11 = peg$parseCloseParen();\n// @ts-ignore\n                  if (s11 !== peg$FAILED) {\n// @ts-ignore\n                    peg$savedPos = s0;\n// @ts-ignore\n                    s0 = peg$f57(s1, s2, s4, s5, s6, s7, s8, s9, s10);\n// @ts-ignore\n                  } else {\n// @ts-ignore\n                    peg$currPos = s0;\n// @ts-ignore\n                    s0 = peg$FAILED;\n                  }\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  peg$currPos = s0;\n// @ts-ignore\n                  s0 = peg$FAILED;\n                }\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJsonObjectFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseJsonObjectToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseSqlKeyValue();\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        s6 = [];\n// @ts-ignore\n        s7 = peg$currPos;\n// @ts-ignore\n        s8 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$parseSqlKeyValue();\n// @ts-ignore\n          if (s9 !== peg$FAILED) {\n// @ts-ignore\n            s8 = [s8, s9];\n// @ts-ignore\n            s7 = s8;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s7;\n// @ts-ignore\n          s7 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6.push(s7);\n// @ts-ignore\n          s7 = peg$currPos;\n// @ts-ignore\n          s8 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parseSqlKeyValue();\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              s8 = [s8, s9];\n// @ts-ignore\n              s7 = s8;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s7;\n// @ts-ignore\n              s7 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseCloseParen();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f58(s1, s2, s4, s5, s6, s7);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseExtractFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseExtractToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n        s2 = peg$c41;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseExtractToken();\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n            s4 = peg$c41;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e43); }\n          }\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseTimeUnitExtra();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parseFromSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseOrExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s8 = peg$parse_();\n// @ts-ignore\n              s9 = peg$parseCloseParen();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                peg$savedPos = s0;\n// @ts-ignore\n                s0 = peg$f59(s1, s2, s4, s5, s6, s7, s8);\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTrimFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseTrimToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n        s2 = peg$c41;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseTrimToken();\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n            s4 = peg$c41;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e43); }\n          }\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$currPos;\n// @ts-ignore\n        s8 = peg$parseLeadingToken();\n// @ts-ignore\n        if (s8 === peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parseBothToken();\n// @ts-ignore\n          if (s8 === peg$FAILED) {\n// @ts-ignore\n            s8 = peg$parseTrailingToken();\n          }\n        }\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$currPos;\n// @ts-ignore\n          s10 = peg$parse_();\n// @ts-ignore\n          s11 = peg$parseFromToken();\n// @ts-ignore\n          if (s11 !== peg$FAILED) {\n// @ts-ignore\n            s10 = [s10, s11];\n// @ts-ignore\n            s9 = s10;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s9;\n// @ts-ignore\n            s9 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s9 === peg$FAILED) {\n// @ts-ignore\n            s9 = null;\n          }\n// @ts-ignore\n          s8 = [s8, s9];\n// @ts-ignore\n          s7 = s8;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s7;\n// @ts-ignore\n          s7 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6 = input.substring(s6, peg$currPos);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s6 = s7;\n        }\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s6 = [s6, s7];\n// @ts-ignore\n          s5 = s6;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        s6 = peg$parseOrExpression();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$currPos;\n// @ts-ignore\n          s8 = peg$parseFromSeparator();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parseOrExpression();\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              s8 = [s8, s9];\n// @ts-ignore\n              s7 = s8;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s7;\n// @ts-ignore\n              s7 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s7 === peg$FAILED) {\n// @ts-ignore\n            s7 = null;\n          }\n// @ts-ignore\n          s8 = peg$parse_();\n// @ts-ignore\n          s9 = peg$parseCloseParen();\n// @ts-ignore\n          if (s9 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f60(s1, s2, s4, s5, s6, s7, s8);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFloorCeilFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseFloorToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$parseCeilToken();\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n        s2 = peg$c41;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseFloorToken();\n// @ts-ignore\n        if (s3 === peg$FAILED) {\n// @ts-ignore\n          s3 = peg$parseCeilToken();\n        }\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n            s4 = peg$c41;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e43); }\n          }\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parseToSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseTimeUnitLiteral();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s8 = peg$parse_();\n// @ts-ignore\n              s9 = peg$parseCloseParen();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                peg$savedPos = s0;\n// @ts-ignore\n                s0 = peg$f61(s1, s2, s4, s5, s6, s7, s8);\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimestampAddDiffFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseTimestampaddToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$parseTimestampdiffToken();\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n        s2 = peg$c41;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseTimestampaddToken();\n// @ts-ignore\n        if (s3 === peg$FAILED) {\n// @ts-ignore\n          s3 = peg$parseTimestampdiffToken();\n        }\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n            s4 = peg$c41;\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e43); }\n          }\n// @ts-ignore\n          if (s4 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseTimeUnitLiteral();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = [];\n// @ts-ignore\n          s7 = peg$currPos;\n// @ts-ignore\n          s8 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parseOrExpression();\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              s8 = [s8, s9];\n// @ts-ignore\n              s7 = s8;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s7;\n// @ts-ignore\n              s7 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n// @ts-ignore\n          while (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6.push(s7);\n// @ts-ignore\n            s7 = peg$currPos;\n// @ts-ignore\n            s8 = peg$parseCommaSeparator();\n// @ts-ignore\n            if (s8 !== peg$FAILED) {\n// @ts-ignore\n              s9 = peg$parseOrExpression();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                s8 = [s8, s9];\n// @ts-ignore\n                s7 = s8;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s7;\n// @ts-ignore\n                s7 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s7;\n// @ts-ignore\n              s7 = peg$FAILED;\n            }\n          }\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseCloseParen();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f62(s1, s2, s4, s5, s6, s7);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePositionFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parsePositionToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parseInSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseOrExpression();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s8 = peg$currPos;\n// @ts-ignore\n              s9 = peg$parseFromSeparator();\n// @ts-ignore\n              if (s9 !== peg$FAILED) {\n// @ts-ignore\n                s10 = peg$parseOrExpression();\n// @ts-ignore\n                if (s10 !== peg$FAILED) {\n// @ts-ignore\n                  s9 = [s9, s10];\n// @ts-ignore\n                  s8 = s9;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  peg$currPos = s8;\n// @ts-ignore\n                  s8 = peg$FAILED;\n                }\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s8;\n// @ts-ignore\n                s8 = peg$FAILED;\n              }\n// @ts-ignore\n              if (s8 === peg$FAILED) {\n// @ts-ignore\n                s8 = null;\n              }\n// @ts-ignore\n              s9 = peg$parse_();\n// @ts-ignore\n              s10 = peg$parseCloseParen();\n// @ts-ignore\n              if (s10 !== peg$FAILED) {\n// @ts-ignore\n                peg$savedPos = s0;\n// @ts-ignore\n                s0 = peg$f63(s1, s2, s4, s5, s6, s7, s8, s9);\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s0;\n// @ts-ignore\n                s0 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s0;\n// @ts-ignore\n              s0 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseArrayFunction() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseArrayToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 91) {\n// @ts-ignore\n        s3 = peg$c42;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e44); }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseOrExpression();\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        s6 = [];\n// @ts-ignore\n        s7 = peg$currPos;\n// @ts-ignore\n        s8 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s9 = peg$parseOrExpression();\n// @ts-ignore\n          if (s9 !== peg$FAILED) {\n// @ts-ignore\n            s8 = [s8, s9];\n// @ts-ignore\n            s7 = s8;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s7;\n// @ts-ignore\n          s7 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6.push(s7);\n// @ts-ignore\n          s7 = peg$currPos;\n// @ts-ignore\n          s8 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s9 = peg$parseOrExpression();\n// @ts-ignore\n            if (s9 !== peg$FAILED) {\n// @ts-ignore\n              s8 = [s8, s9];\n// @ts-ignore\n              s7 = s8;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s7;\n// @ts-ignore\n              s7 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s7;\n// @ts-ignore\n            s7 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 93) {\n// @ts-ignore\n          s8 = peg$c43;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s8 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e45); }\n        }\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f64(s1, s2, s4, s5, s6, s7);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFunctionDecorator() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseDistinctToken();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseAllToken();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFunctionFilter() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseFilterToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseOpenParen();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseSqlWhereClause();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s6 = peg$parse_();\n// @ts-ignore\n          s7 = peg$parseCloseParen();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            peg$savedPos = s0;\n// @ts-ignore\n            s0 = peg$f65(s1, s2, s4, s5, s6);\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s0;\n// @ts-ignore\n            s0 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseWindowSpec() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOpenParen();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseRefName();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s4 = [s4, s5];\n// @ts-ignore\n        s3 = s4;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parsePartitionByClause();\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s5 = [s5, s6];\n// @ts-ignore\n        s4 = s5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = null;\n      }\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      s6 = peg$parseOrderByClause();\n// @ts-ignore\n      if (s6 !== peg$FAILED) {\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s6 = [s6, s7];\n// @ts-ignore\n        s5 = s6;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s5;\n// @ts-ignore\n        s5 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = null;\n      }\n// @ts-ignore\n      s6 = peg$currPos;\n// @ts-ignore\n      s7 = peg$parseRowsToken();\n// @ts-ignore\n      if (s7 === peg$FAILED) {\n// @ts-ignore\n        s7 = peg$parseRangeToken();\n      }\n// @ts-ignore\n      if (s7 !== peg$FAILED) {\n// @ts-ignore\n        s8 = peg$parse_();\n// @ts-ignore\n        s9 = peg$parseFrameBound();\n// @ts-ignore\n        if (s9 === peg$FAILED) {\n// @ts-ignore\n          s9 = peg$currPos;\n// @ts-ignore\n          s10 = peg$parseBetweenToken();\n// @ts-ignore\n          if (s10 !== peg$FAILED) {\n// @ts-ignore\n            s11 = peg$parse_();\n// @ts-ignore\n            s12 = peg$parseFrameBound();\n// @ts-ignore\n            if (s12 !== peg$FAILED) {\n// @ts-ignore\n              s13 = peg$parse_();\n// @ts-ignore\n              s14 = peg$parseAndToken();\n// @ts-ignore\n              if (s14 !== peg$FAILED) {\n// @ts-ignore\n                s15 = peg$parse_();\n// @ts-ignore\n                s16 = peg$parseFrameBound();\n// @ts-ignore\n                if (s16 !== peg$FAILED) {\n// @ts-ignore\n                  s10 = [s10, s11, s12, s13, s14, s15, s16];\n// @ts-ignore\n                  s9 = s10;\n// @ts-ignore\n                } else {\n// @ts-ignore\n                  peg$currPos = s9;\n// @ts-ignore\n                  s9 = peg$FAILED;\n                }\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s9;\n// @ts-ignore\n                s9 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s9;\n// @ts-ignore\n              s9 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s9;\n// @ts-ignore\n            s9 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        if (s9 !== peg$FAILED) {\n// @ts-ignore\n          s10 = peg$parse_();\n// @ts-ignore\n          s7 = [s7, s8, s9, s10];\n// @ts-ignore\n          s6 = s7;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s6;\n// @ts-ignore\n        s6 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s6 === peg$FAILED) {\n// @ts-ignore\n        s6 = null;\n      }\n// @ts-ignore\n      s7 = peg$parseCloseParen();\n// @ts-ignore\n      if (s7 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f66(s2, s3, s4, s5, s6);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePartitionByClause() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parsePartitionByToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseGroupByExpressionList();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f67(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFrameBound() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseCurrentRowToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$currPos;\n// @ts-ignore\n      s2 = peg$parseUnboundedToken();\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = peg$parseDigits();\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parse_();\n// @ts-ignore\n        s4 = peg$parsePrecedingToken();\n// @ts-ignore\n        if (s4 === peg$FAILED) {\n// @ts-ignore\n          s4 = peg$parseFollowingToken();\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s2 = [s2, s3, s4];\n// @ts-ignore\n          s1 = s2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f68(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCommaSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 44) {\n// @ts-ignore\n      s2 = peg$c44;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e46); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f69(s1, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAsSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseAsToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f70(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFromSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseFromToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f71(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseToSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseToToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f72(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseInSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseInToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f73(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseReturningSeparator() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parse_();\n// @ts-ignore\n    s2 = peg$parseReturningToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f74(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlRecordOrExpressionInParens() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseSqlRecord();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f75(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlRecord() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseRowToken();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$parseOpenParen();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s4 = peg$parseOrExpression();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = [];\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s8 = peg$parseOrExpression();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s7 = [s7, s8];\n// @ts-ignore\n            s6 = s7;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5.push(s6);\n// @ts-ignore\n          s6 = peg$currPos;\n// @ts-ignore\n          s7 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s8 = peg$parseOrExpression();\n// @ts-ignore\n            if (s8 !== peg$FAILED) {\n// @ts-ignore\n              s7 = [s7, s8];\n// @ts-ignore\n              s6 = s7;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s6;\n// @ts-ignore\n              s6 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s6;\n// @ts-ignore\n            s6 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseCloseParen();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f76(s1, s3, s4, s5, s6);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlQueryInParens() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseOpenParen();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlQueryInParens();\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = peg$parseSqlQuery();\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse_();\n// @ts-ignore\n        s5 = peg$parseCloseParen();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f77(s2, s3, s4);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlValues() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseValuesToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSqlRecord();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = [];\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parseSqlRecord();\n// @ts-ignore\n          if (s7 !== peg$FAILED) {\n// @ts-ignore\n            s6 = [s6, s7];\n// @ts-ignore\n            s5 = s6;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        while (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4.push(s5);\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          s6 = peg$parseCommaSeparator();\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s7 = peg$parseSqlRecord();\n// @ts-ignore\n            if (s7 !== peg$FAILED) {\n// @ts-ignore\n              s6 = [s6, s7];\n// @ts-ignore\n              s5 = s6;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s5;\n// @ts-ignore\n              s5 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n        }\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseOrderByClause();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6 = [s6, s7];\n// @ts-ignore\n          s5 = s6;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        s6 = peg$currPos;\n// @ts-ignore\n        s7 = peg$parse_();\n// @ts-ignore\n        s8 = peg$parseLimitClause();\n// @ts-ignore\n        if (s8 !== peg$FAILED) {\n// @ts-ignore\n          s7 = [s7, s8];\n// @ts-ignore\n          s6 = s7;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s6;\n// @ts-ignore\n          s6 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s6 = null;\n        }\n// @ts-ignore\n        s7 = peg$currPos;\n// @ts-ignore\n        s8 = peg$parse_();\n// @ts-ignore\n        s9 = peg$parseOffsetClause();\n// @ts-ignore\n        if (s9 !== peg$FAILED) {\n// @ts-ignore\n          s8 = [s8, s9];\n// @ts-ignore\n          s7 = s8;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s7;\n// @ts-ignore\n          s7 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s7 === peg$FAILED) {\n// @ts-ignore\n          s7 = null;\n        }\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f78(s1, s2, s3, s4, s5, s6, s7);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlPlaceholder() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 63) {\n// @ts-ignore\n      s1 = peg$c45;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e47); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f79();\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlLiteral() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseNullToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$parseTrueToken();\n// @ts-ignore\n      if (s1 === peg$FAILED) {\n// @ts-ignore\n        s1 = peg$parseFalseToken();\n// @ts-ignore\n        if (s1 === peg$FAILED) {\n// @ts-ignore\n          s1 = peg$parseNumber();\n// @ts-ignore\n          if (s1 === peg$FAILED) {\n// @ts-ignore\n            s1 = peg$parseSingleQuotedString();\n// @ts-ignore\n            if (s1 === peg$FAILED) {\n// @ts-ignore\n              s1 = peg$parseUnicodeString();\n// @ts-ignore\n              if (s1 === peg$FAILED) {\n// @ts-ignore\n                s1 = peg$parseCharsetString();\n// @ts-ignore\n                if (s1 === peg$FAILED) {\n// @ts-ignore\n                  s1 = peg$parseBinaryString();\n// @ts-ignore\n                  if (s1 === peg$FAILED) {\n// @ts-ignore\n                    s1 = peg$parseTimestamp();\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f80(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNullLiteral() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseNullToken();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f81(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseBooleanLiteral() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseTrueToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$parseFalseToken();\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f82(s1);\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlType() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnquotedRefNameFree();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parseArrayToken();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s3 = [s3, s4];\n// @ts-ignore\n          s2 = s3;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s2;\n// @ts-ignore\n          s2 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseOpenParen();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseSingleQuotedString();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s7 = peg$parse_();\n// @ts-ignore\n          s8 = peg$parseCloseParen();\n// @ts-ignore\n          if (s8 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5, s6, s7, s8];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f83();\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNumber() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (peg$r0.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s1 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$parseDigits();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parseFraction();\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s4 = null;\n      }\n// @ts-ignore\n      s3 = [s3, s4];\n// @ts-ignore\n      s2 = s3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parseFraction();\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      if (input.substr(peg$currPos, 1).toLowerCase() === peg$c46) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e49); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        if (peg$r0.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s5 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s5 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e20); }\n        }\n// @ts-ignore\n        if (s5 === peg$FAILED) {\n// @ts-ignore\n          s5 = null;\n        }\n// @ts-ignore\n        s6 = peg$parseDigits();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f84();\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e48); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFraction() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n      s2 = peg$c40;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e42); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parseDigits();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDigits() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = [];\n// @ts-ignore\n    s2 = peg$parseDigit();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      while (s2 !== peg$FAILED) {\n// @ts-ignore\n        s1.push(s2);\n// @ts-ignore\n        s2 = peg$parseDigit();\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDigit() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (peg$r1.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s0 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e50); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSingleQuotedString() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 39) {\n// @ts-ignore\n      s1 = peg$c47;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e51); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c48) {\n// @ts-ignore\n        s4 = peg$c48;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e52); }\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        if (peg$r2.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e53); }\n        }\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        if (input.substr(peg$currPos, 2) === peg$c48) {\n// @ts-ignore\n          s4 = peg$c48;\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e52); }\n        }\n// @ts-ignore\n        if (s4 === peg$FAILED) {\n// @ts-ignore\n          if (peg$r2.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n            s4 = input.charAt(peg$currPos);\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e53); }\n          }\n        }\n      }\n// @ts-ignore\n      s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 39) {\n// @ts-ignore\n        s3 = peg$c47;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e51); }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f85(s2);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnicodeString() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c49) {\n// @ts-ignore\n      s1 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e54); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parseSingleQuotedString();\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f86(s2);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCharsetString() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 95) {\n// @ts-ignore\n      s1 = peg$c20;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      if (peg$r3.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s2 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e55); }\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [];\n// @ts-ignore\n        if (peg$r4.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e56); }\n        }\n// @ts-ignore\n        while (s4 !== peg$FAILED) {\n// @ts-ignore\n          s3.push(s4);\n// @ts-ignore\n          if (peg$r4.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n            s4 = input.charAt(peg$currPos);\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e56); }\n          }\n        }\n// @ts-ignore\n        s4 = peg$parseSingleQuotedString();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f87(s4);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseBinaryString() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c50) {\n// @ts-ignore\n      s1 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e57); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (peg$r5.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e58); }\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        if (peg$r5.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e58); }\n        }\n      }\n// @ts-ignore\n      s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 39) {\n// @ts-ignore\n        s3 = peg$c47;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e51); }\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f88(s2);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimestamp() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseTimestampToken();\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$parseDateToken();\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parse_();\n// @ts-ignore\n      s3 = peg$parseSingleQuotedString();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f89(s1, s2, s3);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseArrayEntries() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseArrayEntry();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = [];\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parseCommaSeparator();\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parseArrayEntry();\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2.push(s3);\n// @ts-ignore\n        s3 = peg$currPos;\n// @ts-ignore\n        s4 = peg$parseCommaSeparator();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$parseArrayEntry();\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s4 = [s4, s5];\n// @ts-ignore\n            s3 = s4;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s3;\n// @ts-ignore\n            s3 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f90(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseArrayEntry() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseNumber();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseSingleQuotedString();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseUnicodeString();\n// @ts-ignore\n        if (s0 === peg$FAILED) {\n// @ts-ignore\n          s0 = peg$parseBinaryString();\n        }\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlColumn() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefName();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s4 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseRefName();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s3 = [s3, s4, s5, s6];\n// @ts-ignore\n          s2 = s3;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s2;\n// @ts-ignore\n          s2 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s5 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s7 = peg$parseRefName();\n// @ts-ignore\n        if (s7 !== peg$FAILED) {\n// @ts-ignore\n          s4 = [s4, s5, s6, s7];\n// @ts-ignore\n          s3 = s4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s3;\n// @ts-ignore\n          s3 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 === peg$FAILED) {\n// @ts-ignore\n        s3 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f91(s1, s2, s3);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlTable() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseRefName();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s4 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s6 = peg$parseRefName();\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s3 = [s3, s4, s5, s6];\n// @ts-ignore\n          s2 = s3;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s2;\n// @ts-ignore\n          s2 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 === peg$FAILED) {\n// @ts-ignore\n        s2 = null;\n      }\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f92(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRefName() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseQuotedRefName();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseUnicodeRefName();\n// @ts-ignore\n      if (s0 === peg$FAILED) {\n// @ts-ignore\n        s0 = peg$parseUnquotedRefName();\n      }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRefNameAlias() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseQuotedRefName();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseUnquotedRefNameAlias();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRefNameFunction() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    s0 = peg$parseQuotedRefName();\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s0 = peg$parseUnquotedRefNameFunction();\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseQuotedRefName() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n      s1 = peg$c41;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e43); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$currPos;\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c51) {\n// @ts-ignore\n        s4 = peg$c51;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e59); }\n      }\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        if (peg$r6.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e60); }\n        }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        while (s4 !== peg$FAILED) {\n// @ts-ignore\n          s3.push(s4);\n// @ts-ignore\n          if (input.substr(peg$currPos, 2) === peg$c51) {\n// @ts-ignore\n            s4 = peg$c51;\n// @ts-ignore\n            peg$currPos += 2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s4 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e59); }\n          }\n// @ts-ignore\n          if (s4 === peg$FAILED) {\n// @ts-ignore\n            if (peg$r6.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n              s4 = input.charAt(peg$currPos);\n// @ts-ignore\n              peg$currPos++;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s4 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e60); }\n            }\n          }\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = input.substring(s2, peg$currPos);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = s3;\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        if (input.charCodeAt(peg$currPos) === 34) {\n// @ts-ignore\n          s3 = peg$c41;\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s3 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e43); }\n        }\n// @ts-ignore\n        if (s3 !== peg$FAILED) {\n// @ts-ignore\n          peg$savedPos = s0;\n// @ts-ignore\n          s0 = peg$f93(s2);\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s0;\n// @ts-ignore\n          s0 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnicodeRefName() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c49) {\n// @ts-ignore\n      s1 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e54); }\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s2 = peg$parseQuotedRefName();\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f94(s2);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnquotedRefName() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnquotedRefNameFree();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = peg$currPos;\n// @ts-ignore\n      s2 = peg$f95(s1);\n// @ts-ignore\n      if (s2) {\n// @ts-ignore\n        s2 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f96(s1);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnquotedRefNameAlias() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnquotedRefNameFree();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = peg$currPos;\n// @ts-ignore\n      s2 = peg$f97(s1);\n// @ts-ignore\n      if (s2) {\n// @ts-ignore\n        s2 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f98(s1);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnquotedRefNameFunction() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$parseUnquotedRefNameFree();\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = peg$currPos;\n// @ts-ignore\n      s2 = peg$f99(s1);\n// @ts-ignore\n      if (s2) {\n// @ts-ignore\n        s2 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s2 !== peg$FAILED) {\n// @ts-ignore\n        peg$savedPos = s0;\n// @ts-ignore\n        s0 = peg$f100(s1);\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s0;\n// @ts-ignore\n        s0 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnquotedRefNameFree() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (peg$r7.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s2 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e61); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (peg$r8.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e62); }\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        if (peg$r8.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e62); }\n        }\n      }\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSqlStar() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseRefName();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s4 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parse_();\n// @ts-ignore\n        s2 = [s2, s3, s4, s5];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 === peg$FAILED) {\n// @ts-ignore\n      s1 = null;\n    }\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    s3 = peg$parseRefName();\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$parse_();\n// @ts-ignore\n      if (input.charCodeAt(peg$currPos) === 46) {\n// @ts-ignore\n        s5 = peg$c40;\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s5 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = peg$parse_();\n// @ts-ignore\n        s3 = [s3, s4, s5, s6];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 === peg$FAILED) {\n// @ts-ignore\n      s2 = null;\n    }\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 42) {\n// @ts-ignore\n      s3 = peg$c17;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s3 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s0 = peg$f101(s1, s2);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s0;\n// @ts-ignore\n      s0 = peg$FAILED;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseIdentifierPart() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (peg$r7.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s0 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e61); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parse_() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = [];\n// @ts-ignore\n    s3 = peg$parseSpace();\n// @ts-ignore\n    while (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2.push(s3);\n// @ts-ignore\n      s3 = peg$parseSpace();\n    }\n// @ts-ignore\n    s3 = [];\n// @ts-ignore\n    s4 = peg$currPos;\n// @ts-ignore\n    s5 = peg$parseSingleLineComment();\n// @ts-ignore\n    if (s5 === peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parseMultiLineComment();\n    }\n// @ts-ignore\n    if (s5 !== peg$FAILED) {\n// @ts-ignore\n      s6 = [];\n// @ts-ignore\n      s7 = peg$parseSpace();\n// @ts-ignore\n      while (s7 !== peg$FAILED) {\n// @ts-ignore\n        s6.push(s7);\n// @ts-ignore\n        s7 = peg$parseSpace();\n      }\n// @ts-ignore\n      s5 = [s5, s6];\n// @ts-ignore\n      s4 = s5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s4;\n// @ts-ignore\n      s4 = peg$FAILED;\n    }\n// @ts-ignore\n    while (s4 !== peg$FAILED) {\n// @ts-ignore\n      s3.push(s4);\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parseSingleLineComment();\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parseMultiLineComment();\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = [];\n// @ts-ignore\n        s7 = peg$parseSpace();\n// @ts-ignore\n        while (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6.push(s7);\n// @ts-ignore\n          s7 = peg$parseSpace();\n        }\n// @ts-ignore\n        s5 = [s5, s6];\n// @ts-ignore\n        s4 = s5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    s4 = peg$parseFinalSingleLineComment();\n// @ts-ignore\n    if (s4 === peg$FAILED) {\n// @ts-ignore\n      s4 = null;\n    }\n// @ts-ignore\n    s2 = [s2, s3, s4];\n// @ts-ignore\n    s1 = s2;\n// @ts-ignore\n    s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    s1 = peg$FAILED;\n// @ts-ignore\n    if (peg$silentFails === 0) { peg$fail(peg$e63); }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parse__() {\n// @ts-ignore\n    var s0, s1, s2, s3;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$parseSpace();\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse_();\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parse___() {\n// @ts-ignore\n    var s0, s1, s2;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = [];\n// @ts-ignore\n    s2 = peg$parseSpace();\n// @ts-ignore\n    while (s2 !== peg$FAILED) {\n// @ts-ignore\n      s1.push(s2);\n// @ts-ignore\n      s2 = peg$parseSpace();\n    }\n// @ts-ignore\n    s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    s1 = peg$FAILED;\n// @ts-ignore\n    if (peg$silentFails === 0) { peg$fail(peg$e65); }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parse_sc() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = [];\n// @ts-ignore\n    s3 = peg$parseSpaceOrSemicolon();\n// @ts-ignore\n    while (s3 !== peg$FAILED) {\n// @ts-ignore\n      s2.push(s3);\n// @ts-ignore\n      s3 = peg$parseSpaceOrSemicolon();\n    }\n// @ts-ignore\n    s3 = [];\n// @ts-ignore\n    s4 = peg$currPos;\n// @ts-ignore\n    s5 = peg$parseSingleLineComment();\n// @ts-ignore\n    if (s5 === peg$FAILED) {\n// @ts-ignore\n      s5 = peg$parseMultiLineComment();\n    }\n// @ts-ignore\n    if (s5 !== peg$FAILED) {\n// @ts-ignore\n      s6 = [];\n// @ts-ignore\n      s7 = peg$parseSpaceOrSemicolon();\n// @ts-ignore\n      while (s7 !== peg$FAILED) {\n// @ts-ignore\n        s6.push(s7);\n// @ts-ignore\n        s7 = peg$parseSpaceOrSemicolon();\n      }\n// @ts-ignore\n      s5 = [s5, s6];\n// @ts-ignore\n      s4 = s5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s4;\n// @ts-ignore\n      s4 = peg$FAILED;\n    }\n// @ts-ignore\n    while (s4 !== peg$FAILED) {\n// @ts-ignore\n      s3.push(s4);\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$parseSingleLineComment();\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s5 = peg$parseMultiLineComment();\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        s6 = [];\n// @ts-ignore\n        s7 = peg$parseSpaceOrSemicolon();\n// @ts-ignore\n        while (s7 !== peg$FAILED) {\n// @ts-ignore\n          s6.push(s7);\n// @ts-ignore\n          s7 = peg$parseSpaceOrSemicolon();\n        }\n// @ts-ignore\n        s5 = [s5, s6];\n// @ts-ignore\n        s4 = s5;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n    }\n// @ts-ignore\n    s4 = peg$parseFinalSingleLineComment();\n// @ts-ignore\n    if (s4 === peg$FAILED) {\n// @ts-ignore\n      s4 = null;\n    }\n// @ts-ignore\n    s2 = [s2, s3, s4];\n// @ts-ignore\n    s1 = s2;\n// @ts-ignore\n    s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    s1 = peg$FAILED;\n// @ts-ignore\n    if (peg$silentFails === 0) { peg$fail(peg$e66); }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSingleLineComment() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2) === peg$c52) {\n// @ts-ignore\n      s2 = peg$c52;\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e67); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (peg$r9.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e68); }\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        if (peg$r9.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e68); }\n        }\n      }\n// @ts-ignore\n      if (peg$r10.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e69); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3, s4];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFinalSingleLineComment() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2) === peg$c52) {\n// @ts-ignore\n      s2 = peg$c52;\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e67); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      if (peg$r9.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n        s4 = input.charAt(peg$currPos);\n// @ts-ignore\n        peg$currPos++;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e68); }\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        if (peg$r9.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n          s4 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e68); }\n        }\n      }\n// @ts-ignore\n      s2 = [s2, s3];\n// @ts-ignore\n      s1 = s2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseMultiLineComment() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2) === peg$c53) {\n// @ts-ignore\n      s2 = peg$c53;\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e70); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = [];\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      s5 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c54) {\n// @ts-ignore\n        s6 = peg$c54;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s6 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e71); }\n      }\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s6 === peg$FAILED) {\n// @ts-ignore\n        s5 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s5;\n// @ts-ignore\n        s5 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s5 !== peg$FAILED) {\n// @ts-ignore\n        if (input.length > peg$currPos) {\n// @ts-ignore\n          s6 = input.charAt(peg$currPos);\n// @ts-ignore\n          peg$currPos++;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s6 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n// @ts-ignore\n        if (s6 !== peg$FAILED) {\n// @ts-ignore\n          s5 = [s5, s6];\n// @ts-ignore\n          s4 = s5;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      while (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3.push(s4);\n// @ts-ignore\n        s4 = peg$currPos;\n// @ts-ignore\n        s5 = peg$currPos;\n// @ts-ignore\n        peg$silentFails++;\n// @ts-ignore\n        if (input.substr(peg$currPos, 2) === peg$c54) {\n// @ts-ignore\n          s6 = peg$c54;\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s6 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e71); }\n        }\n// @ts-ignore\n        peg$silentFails--;\n// @ts-ignore\n        if (s6 === peg$FAILED) {\n// @ts-ignore\n          s5 = undefined;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s5;\n// @ts-ignore\n          s5 = peg$FAILED;\n        }\n// @ts-ignore\n        if (s5 !== peg$FAILED) {\n// @ts-ignore\n          if (input.length > peg$currPos) {\n// @ts-ignore\n            s6 = input.charAt(peg$currPos);\n// @ts-ignore\n            peg$currPos++;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            s6 = peg$FAILED;\n// @ts-ignore\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n// @ts-ignore\n          if (s6 !== peg$FAILED) {\n// @ts-ignore\n            s5 = [s5, s6];\n// @ts-ignore\n            s4 = s5;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s4;\n// @ts-ignore\n            s4 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s4;\n// @ts-ignore\n          s4 = peg$FAILED;\n        }\n      }\n// @ts-ignore\n      if (input.substr(peg$currPos, 2) === peg$c54) {\n// @ts-ignore\n        s4 = peg$c54;\n// @ts-ignore\n        peg$currPos += 2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        s4 = peg$FAILED;\n// @ts-ignore\n        if (peg$silentFails === 0) { peg$fail(peg$e71); }\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3, s4];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSpace() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (peg$r11.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s0 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e72); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSpaceOrSemicolon() {\n// @ts-ignore\n    var s0;\n\n// @ts-ignore\n    if (peg$r12.test(input.charAt(peg$currPos))) {\n// @ts-ignore\n      s0 = input.charAt(peg$currPos);\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e73); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOpenParen() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 40) {\n// @ts-ignore\n      s0 = peg$c55;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e75); }\n    }\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e74); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCloseParen() {\n// @ts-ignore\n    var s0, s1;\n\n// @ts-ignore\n    peg$silentFails++;\n// @ts-ignore\n    if (input.charCodeAt(peg$currPos) === 41) {\n// @ts-ignore\n      s0 = peg$c56;\n// @ts-ignore\n      peg$currPos++;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e77); }\n    }\n// @ts-ignore\n    peg$silentFails--;\n// @ts-ignore\n    if (s0 === peg$FAILED) {\n// @ts-ignore\n      s1 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e76); }\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAllToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c57) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e78); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAndToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c58) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e79); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAnyToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c59) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e80); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseArrayToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c60) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e81); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAsToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c61) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e82); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseAscToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c62) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e83); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseBetweenToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c63) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e84); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseBothToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c64) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e85); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCaseToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c65) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e86); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCastToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c66) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e87); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCeilToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c67) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e88); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseClusteredByToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c68) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e89); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c69) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 2);\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e90); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCountToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c70) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e91); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCsvToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c71) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e92); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCurrentRowToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c72) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e93); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 3).toLowerCase() === peg$c73) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 3);\n// @ts-ignore\n          peg$currPos += 3;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e94); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseCubeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c74) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e95); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDateToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c75) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e96); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDescToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c76) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e97); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseDistinctToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c77) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 8);\n// @ts-ignore\n      peg$currPos += 8;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e98); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseElseToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c78) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e99); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseEndToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c79) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e100); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseEscapeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c80) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e101); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseExplainPlanForToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c81) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e102); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c82) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 4);\n// @ts-ignore\n          peg$currPos += 4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e103); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$parse__();\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            if (input.substr(peg$currPos, 3).toLowerCase() === peg$c83) {\n// @ts-ignore\n              s6 = input.substr(peg$currPos, 3);\n// @ts-ignore\n              peg$currPos += 3;\n// @ts-ignore\n            } else {\n// @ts-ignore\n              s6 = peg$FAILED;\n// @ts-ignore\n              if (peg$silentFails === 0) { peg$fail(peg$e104); }\n            }\n// @ts-ignore\n            if (s6 !== peg$FAILED) {\n// @ts-ignore\n              s7 = peg$currPos;\n// @ts-ignore\n              peg$silentFails++;\n// @ts-ignore\n              s8 = peg$parseIdentifierPart();\n// @ts-ignore\n              peg$silentFails--;\n// @ts-ignore\n              if (s8 === peg$FAILED) {\n// @ts-ignore\n                s7 = undefined;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s7;\n// @ts-ignore\n                s7 = peg$FAILED;\n              }\n// @ts-ignore\n              if (s7 !== peg$FAILED) {\n// @ts-ignore\n                s2 = [s2, s3, s4, s5, s6, s7];\n// @ts-ignore\n                s1 = s2;\n// @ts-ignore\n              } else {\n// @ts-ignore\n                peg$currPos = s1;\n// @ts-ignore\n                s1 = peg$FAILED;\n              }\n// @ts-ignore\n            } else {\n// @ts-ignore\n              peg$currPos = s1;\n// @ts-ignore\n              s1 = peg$FAILED;\n            }\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseExtendToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c84) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e105); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseExtractToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c85) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e106); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFalseToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c86) {\n// @ts-ignore\n      s3 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s3 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e107); }\n    }\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s5 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s4 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s1 = input.substring(s1, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = s2;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f102();\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFilterToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c87) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e108); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFloorToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c88) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e109); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFollowingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c89) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e110); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseFromToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c90) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e111); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGroupByToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c91) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e112); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c69) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 2);\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e90); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseGroupingSetsToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c92) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 8);\n// @ts-ignore\n      peg$currPos += 8;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e113); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c93) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 4);\n// @ts-ignore\n          peg$currPos += 4;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e114); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseHavingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c94) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e115); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseInToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c95) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e116); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseInsertToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c96) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e117); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseIntervalToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c97) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 8);\n// @ts-ignore\n      peg$currPos += 8;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e118); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseIntoToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c98) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e119); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseIsToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c99) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e120); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJoinToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c100) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e121); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJsonValueToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 10).toLowerCase() === peg$c101) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 10);\n// @ts-ignore\n      peg$currPos += 10;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e122); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseJsonObjectToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 11).toLowerCase() === peg$c102) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 11);\n// @ts-ignore\n      peg$currPos += 11;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e123); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseKeyToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c103) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e124); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseValueToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c104) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e125); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseLeadingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c105) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e126); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseLikeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c106) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e127); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseLimitToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c107) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e128); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNaturalToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c108) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e129); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNotToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c109) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e130); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseNullToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c110) {\n// @ts-ignore\n      s3 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s3 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e131); }\n    }\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s5 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s4 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s1 = input.substring(s1, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = s2;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f103();\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOffsetToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c111) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e132); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOnToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c112) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e133); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOrToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c113) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e134); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOrderByToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c114) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e135); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c69) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 2);\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e90); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOuterToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c115) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e136); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOverToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c116) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e137); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseOverwriteToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c117) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e138); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePartitionedByToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 11).toLowerCase() === peg$c118) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 11);\n// @ts-ignore\n      peg$currPos += 11;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e139); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c69) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 2);\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e90); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePartitionByToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5, s6;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c119) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e140); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$parse__();\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c69) {\n// @ts-ignore\n          s4 = input.substr(peg$currPos, 2);\n// @ts-ignore\n          peg$currPos += 2;\n// @ts-ignore\n        } else {\n// @ts-ignore\n          s4 = peg$FAILED;\n// @ts-ignore\n          if (peg$silentFails === 0) { peg$fail(peg$e90); }\n        }\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$currPos;\n// @ts-ignore\n          peg$silentFails++;\n// @ts-ignore\n          s6 = peg$parseIdentifierPart();\n// @ts-ignore\n          peg$silentFails--;\n// @ts-ignore\n          if (s6 === peg$FAILED) {\n// @ts-ignore\n            s5 = undefined;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s5;\n// @ts-ignore\n            s5 = peg$FAILED;\n          }\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePositionToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c120) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 8);\n// @ts-ignore\n      peg$currPos += 8;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e141); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parsePrecedingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c121) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e142); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRangeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c122) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e143); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseReplaceToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 7).toLowerCase() === peg$c123) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 7);\n// @ts-ignore\n      peg$currPos += 7;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e144); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseReturningToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c124) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e145); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRollupToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c125) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e146); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRowToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c73) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e94); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseRowsToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c126) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e147); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSelectToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c127) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e148); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSetToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c128) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 3);\n// @ts-ignore\n      peg$currPos += 3;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e149); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSomeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c129) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e150); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseSymmetricToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c130) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e151); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTableToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c131) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e152); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseThenToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c132) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e153); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimeToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c133) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e154); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimestampToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c134) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e155); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimestampaddToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 12).toLowerCase() === peg$c135) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 12);\n// @ts-ignore\n      peg$currPos += 12;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e156); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTimestampdiffToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 13).toLowerCase() === peg$c136) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 13);\n// @ts-ignore\n      peg$currPos += 13;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e157); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseToToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 2);\n// @ts-ignore\n      peg$currPos += 2;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e158); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTrailingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c138) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 8);\n// @ts-ignore\n      peg$currPos += 8;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e159); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTrimToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c139) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e160); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseTrueToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    s2 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c140) {\n// @ts-ignore\n      s3 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s3 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e161); }\n    }\n// @ts-ignore\n    if (s3 !== peg$FAILED) {\n// @ts-ignore\n      s4 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s5 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s5 === peg$FAILED) {\n// @ts-ignore\n        s4 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s4;\n// @ts-ignore\n        s4 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s4 !== peg$FAILED) {\n// @ts-ignore\n        s3 = [s3, s4];\n// @ts-ignore\n        s2 = s3;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s2;\n// @ts-ignore\n        s2 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s2;\n// @ts-ignore\n      s2 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s1 = input.substring(s1, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s1 = s2;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      peg$savedPos = s0;\n// @ts-ignore\n      s1 = peg$f104();\n    }\n// @ts-ignore\n    s0 = s1;\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnboundedToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c141) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 9);\n// @ts-ignore\n      peg$currPos += 9;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e162); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUnionAllToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4, s5;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c142) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e163); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s4 = peg$parse__();\n// @ts-ignore\n        if (s4 !== peg$FAILED) {\n// @ts-ignore\n          s5 = peg$parseAllToken();\n// @ts-ignore\n          if (s5 !== peg$FAILED) {\n// @ts-ignore\n            s2 = [s2, s3, s4, s5];\n// @ts-ignore\n            s1 = s2;\n// @ts-ignore\n          } else {\n// @ts-ignore\n            peg$currPos = s1;\n// @ts-ignore\n            s1 = peg$FAILED;\n          }\n// @ts-ignore\n        } else {\n// @ts-ignore\n          peg$currPos = s1;\n// @ts-ignore\n          s1 = peg$FAILED;\n        }\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseUsingToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c143) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e164); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseValuesToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c144) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 6);\n// @ts-ignore\n      peg$currPos += 6;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e165); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseWhenToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c145) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e166); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseWhereToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c146) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 5);\n// @ts-ignore\n      peg$currPos += 5;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e167); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n// @ts-ignore\n  function // @ts-ignore\npeg$parseWithToken() {\n// @ts-ignore\n    var s0, s1, s2, s3, s4;\n\n// @ts-ignore\n    s0 = peg$currPos;\n// @ts-ignore\n    s1 = peg$currPos;\n// @ts-ignore\n    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c147) {\n// @ts-ignore\n      s2 = input.substr(peg$currPos, 4);\n// @ts-ignore\n      peg$currPos += 4;\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s2 = peg$FAILED;\n// @ts-ignore\n      if (peg$silentFails === 0) { peg$fail(peg$e168); }\n    }\n// @ts-ignore\n    if (s2 !== peg$FAILED) {\n// @ts-ignore\n      s3 = peg$currPos;\n// @ts-ignore\n      peg$silentFails++;\n// @ts-ignore\n      s4 = peg$parseIdentifierPart();\n// @ts-ignore\n      peg$silentFails--;\n// @ts-ignore\n      if (s4 === peg$FAILED) {\n// @ts-ignore\n        s3 = undefined;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s3;\n// @ts-ignore\n        s3 = peg$FAILED;\n      }\n// @ts-ignore\n      if (s3 !== peg$FAILED) {\n// @ts-ignore\n        s2 = [s2, s3];\n// @ts-ignore\n        s1 = s2;\n// @ts-ignore\n      } else {\n// @ts-ignore\n        peg$currPos = s1;\n// @ts-ignore\n        s1 = peg$FAILED;\n      }\n// @ts-ignore\n    } else {\n// @ts-ignore\n      peg$currPos = s1;\n// @ts-ignore\n      s1 = peg$FAILED;\n    }\n// @ts-ignore\n    if (s1 !== peg$FAILED) {\n// @ts-ignore\n      s0 = input.substring(s0, peg$currPos);\n// @ts-ignore\n    } else {\n// @ts-ignore\n      s0 = s1;\n    }\n\n// @ts-ignore\n    return s0;\n  }\n\n\n// @ts-ignore\n  function makeListMap(tail, index, head) {\n// @ts-ignore\n    if (head === undefined) {\n// @ts-ignore\n      head = [];\n// @ts-ignore\n    } else {\n// @ts-ignore\n      head = [head];\n    }\n// @ts-ignore\n    return head.concat(\n// @ts-ignore\n      tail.map(function (t) {\n// @ts-ignore\n        return t[index];\n      }),\n    );\n  }\n\n// @ts-ignore\n  function maybeMakeMulti(op, head, tail) {\n// @ts-ignore\n    if (!tail.length) return head;\n// @ts-ignore\n    return new S.SqlMulti({\n// @ts-ignore\n      op: op,\n// @ts-ignore\n      args: new S.SeparatedArray(makeListMap(tail, 3, head), makeSeparatorsList(tail)),\n    });\n  }\n\n// @ts-ignore\n  function makeSeparatorsList(tail) {\n// @ts-ignore\n    return tail.map(function (t) {\n// @ts-ignore\n      return new S.Separator({\n// @ts-ignore\n        left: t[0],\n// @ts-ignore\n        separator: t[1],\n// @ts-ignore\n        right: t[2],\n      });\n    });\n  }\n\n// @ts-ignore\n  function makeSeparatedArray(head, tail) {\n// @ts-ignore\n    return new S.SeparatedArray(makeListMap(tail, 1, head), makeListMap(tail, 0));\n  }\n\n// @ts-ignore\n  function makeFunctionName(f) {\n// @ts-ignore\n    return Array.isArray(f) ? S.RefName.functionName(f[1], true) : S.RefName.functionName(f);\n  }\n\n// @ts-ignore\n  peg$result = peg$startRuleFunction();\n\n// @ts-ignore\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n// @ts-ignore\n    return peg$result;\n// @ts-ignore\n  } else {\n// @ts-ignore\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n// @ts-ignore\n      peg$fail(peg$endExpectation());\n    }\n\n// @ts-ignore\n    throw peg$buildStructuredError(\n// @ts-ignore\n      peg$maxFailExpected,\n// @ts-ignore\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n// @ts-ignore\n      peg$maxFailPos < input.length\n// @ts-ignore\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n// @ts-ignore\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\n// @ts-ignore\n  return {\n    SyntaxError: peg$SyntaxError,\n    parse: peg$parse\n  };\n})()\n\nexport interface FilePosition {\n  offset: number;\n  line: number;\n  column: number;\n}\n\nexport interface FileRange {\n  start: FilePosition;\n  end: FilePosition;\n  source: string;\n}\n\nexport interface LiteralExpectation {\n  type: \"literal\";\n  text: string;\n  ignoreCase: boolean;\n}\n\nexport interface ClassParts extends Array<string | ClassParts> {}\n\nexport interface ClassExpectation {\n  type: \"class\";\n  parts: ClassParts;\n  inverted: boolean;\n  ignoreCase: boolean;\n}\n\nexport interface AnyExpectation {\n  type: \"any\";\n}\n\nexport interface EndExpectation {\n  type: \"end\";\n}\n\nexport interface OtherExpectation {\n  type: \"other\";\n  description: string;\n}\n\nexport type Expectation = LiteralExpectation | ClassExpectation | AnyExpectation | EndExpectation | OtherExpectation;\n\ndeclare class _PeggySyntaxError extends Error {\n  public static buildMessage(expected: Expectation[], found: string | null): string;\n  public message: string;\n  public expected: Expectation[];\n  public found: string | null;\n  public location: FileRange;\n  public name: string;\n  constructor(message: string, expected: Expectation[], found: string | null, location: FileRange);\n  format(sources: {\n    source?: any;\n    text: string;\n  }[]): string;\n}\n\nexport interface TraceEvent {\n    type: string;\n    rule: string;\n    result?: any;\n    location: FileRange;\n  }\n\ndeclare class _DefaultTracer {\n  private indentLevel: number;\n  public trace(event: TraceEvent): void;\n}\n\npeggyParser.SyntaxError.prototype.name = \"PeggySyntaxError\";\n\nexport interface ParseOptions {\n  filename?: string;\n  startRule?: \"Start\" | \"StartSetStatementsOnly\";\n  tracer?: any;\n  [key: string]: any;\n}\nexport type ParseFunction = <Options extends ParseOptions>(\n    input: string,\n    options?: Options\n  ) => Options extends { startRule: infer StartRule } ?\n    StartRule extends \"Start\" ? Start :\n    StartRule extends \"StartSetStatementsOnly\" ? StartSetStatementsOnly : Start\n    : Start;\nexport const parse: ParseFunction = peggyParser.parse;\n\nexport const PeggySyntaxError = peggyParser.SyntaxError as typeof _PeggySyntaxError;\n\nexport type PeggySyntaxError = _PeggySyntaxError;\n\n// These types were autogenerated by ts-pegjs\nexport type Start = SqlQueryWithPossibleContext | SqlAlias;\nexport type StartSetStatementsOnly = { spaceBefore: _; rest: string };\nexport type SqlAlias = any;\nexport type GeneralFunctionArgument = SqlLabeledExpression | SqlAlias;\nexport type SqlLabeledExpression = any;\nexport type SqlKeyValue = LongKeyValueForm | ShortKeyValueForm;\nexport type LongKeyValueForm = any;\nexport type ShortKeyValueForm = any;\nexport type SqlExtendClause = any;\nexport type SqlColumnDeclaration = any;\nexport type SqlQueryWithPossibleContext = any;\nexport type SqlSetStatement = any;\nexport type SqlQuery = any;\nexport type QueryHeart = { value: {}; keywords: {}; spacing: {} };\nexport type InsertClause = any;\nexport type ReplaceClause = any;\nexport type WithClause = any;\nexport type SqlWithPart = any;\nexport type SqlColumnList = any;\nexport type SelectClause = {\n  selectKeyword: SelectToken;\n  postSelect: _;\n  selectExpressions: any;\n};\nexport type SqlStarOrAliasExpression = SqlStar | SqlAlias;\nexport type FromClause = any;\nexport type JoinClauses = any;\nexport type SqlJoinPart = any;\nexport type JoinType = string;\nexport type SqlWhereClause = any;\nexport type GroupByClause = any;\nexport type GroupByExpressionList = any;\nexport type GroupByExpression = SqlEmptyRecord | OrExpression;\nexport type SqlEmptyRecord = any;\nexport type HavingClause = any;\nexport type OrderByClause = any;\nexport type SqlOrderByExpression = any;\nexport type LimitClause = any;\nexport type OffsetClause = any;\nexport type PartitionedByClause = any;\nexport type ClusteredByClause = any;\nexport type UnionClause = {\n  unionKeyword: UnionAllToken;\n  postUnion: _;\n  unionQuery: SqlQuery;\n};\nexport type OrExpression = any;\nexport type AndExpression = any;\nexport type NotExpression = any | ComparisonExpression;\nexport type ComparisonExpression = any;\nexport type ComparisonOpRhs =\n  | ComparisonOpRhsCompare\n  | ComparisonOpRhsIs\n  | ComparisonOpRhsIn\n  | ComparisonOpRhsBetween\n  | ComparisonOpRhsLike;\nexport type ComparisonOpRhsCompare = {\n  op: string | ComparisonOperator;\n  opKeyword: ComparisonOperator;\n  postOp: _;\n};\nexport type ComparisonOperator = \"=\" | \"<>\" | \"!=\" | \">=\" | \"<=\" | \"<\" | \">\";\nexport type ComparisonDecorator = AnyToken | AllToken | SomeToken;\nexport type ComparisonOpRhsIs = {\n  op: string;\n  opKeyword: string;\n  postOp: _;\n  rhs: AdditionExpression;\n};\nexport type ComparisonOpRhsIn = {\n  op: \"NOT IN\" | \"IN\";\n  opKeyword: any;\n  postOp: _;\n  rhs: SqlQueryInParens | SqlRecord;\n};\nexport type ComparisonOpRhsBetween = {\n  op: \"NOT BETWEEN\" | \"BETWEEN\";\n  opKeyword: any;\n  postOp: _;\n  rhs: any;\n};\nexport type ComparisonOpRhsLike = {\n  op: \"NOT LIKE\" | \"LIKE\";\n  opKeyword: any;\n  postOp: _;\n  rhs: any;\n};\nexport type AdditionExpression = any;\nexport type SubtractionExpression = any;\nexport type MultiplicationExpression = any;\nexport type DivisionExpression = any;\nexport type UnaryExpression = any | ConcatExpression;\nexport type ConcatExpression = any;\nexport type BaseType =\n  | SqlPlaceholder\n  | Interval\n  | CaseExpression\n  | Function_1\n  | SqlValues\n  | SqlLiteral\n  | SqlColumn\n  | SqlRecordOrExpressionInParens\n  | SqlQueryInParens;\nexport type CaseExpression = any;\nexport type SqlWhenThenPart = any;\nexport type Interval = any;\nexport type TimeUnitLiteral = any;\nexport type TimeUnit = string;\nexport type TimeUnitExtra = TimeUnit | string;\nexport type Function_1 =\n  | CastFunction\n  | GenericFunction\n  | CountStarFunction\n  | ExtractFunction\n  | TrimFunction\n  | FloorCeilFunction\n  | TimestampAddDiffFunction\n  | PositionFunction\n  | JsonValueReturningFunction\n  | JsonObjectFunction\n  | ArrayFunction\n  | NakedFunction;\nexport type GenericFunction = any;\nexport type NakedFunction = any;\nexport type CountStarFunction = any;\nexport type CastFunction = any;\nexport type JsonValueReturningFunction = any;\nexport type JsonObjectFunction = any;\nexport type ExtractFunction = any;\nexport type TrimFunction = any;\nexport type FloorCeilFunction = any;\nexport type TimestampAddDiffFunction = any;\nexport type PositionFunction = any;\nexport type ArrayFunction = any;\nexport type FunctionDecorator = DistinctToken | AllToken;\nexport type FunctionFilter = {\n  filterKeyword: FilterToken;\n  postFilter: _;\n  whereClause: any;\n};\nexport type WindowSpec = any;\nexport type PartitionByClause = any;\nexport type FrameBound = any;\nexport type CommaSeparator = any;\nexport type AsSeparator = any;\nexport type FromSeparator = any;\nexport type ToSeparator = any;\nexport type InSeparator = any;\nexport type ReturningSeparator = any;\nexport type SqlRecordOrExpressionInParens = any;\nexport type SqlRecord = any;\nexport type SqlQueryInParens = any;\nexport type SqlValues = any;\nexport type SqlPlaceholder = any;\nexport type SqlLiteral = any;\nexport type NullLiteral = any;\nexport type BooleanLiteral = any;\nexport type SqlType = any;\nexport type Number_1 = { value: number | bigint; stringValue: string };\nexport type Fraction = string;\nexport type Digits = string;\nexport type Digit = string;\nexport type SingleQuotedString = { value: string; stringValue: string };\nexport type UnicodeString = { value: any; stringValue: string };\nexport type CharsetString = { value: any; stringValue: string };\nexport type BinaryString = { value: string; stringValue: string };\nexport type Timestamp = {\n  spacing: { postTimestamp: _ };\n  keywords: { timestamp: TimestampToken | DateToken };\n  value: Date;\n  stringValue: any;\n};\nexport type ArrayEntries = any;\nexport type ArrayEntry =\n  | Number_1\n  | SingleQuotedString\n  | UnicodeString\n  | BinaryString;\nexport type SqlColumn = any;\nexport type SqlTable = any;\nexport type RefName = QuotedRefName | UnicodeRefName | UnquotedRefName;\nexport type RefNameAlias = QuotedRefName | UnquotedRefNameAlias;\nexport type RefNameFunction = QuotedRefName | UnquotedRefNameFunction;\nexport type QuotedRefName = any;\nexport type UnicodeRefName = any;\nexport type UnquotedRefName = any;\nexport type UnquotedRefNameAlias = any;\nexport type UnquotedRefNameFunction = any;\nexport type UnquotedRefNameFree = string;\nexport type SqlStar = any;\nexport type IdentifierPart = string;\nexport type _ = string;\nexport type __ = string;\nexport type ___ = string;\nexport type _Sc = string;\nexport type SingleLineComment = string;\nexport type FinalSingleLineComment = string;\nexport type MultiLineComment = string;\nexport type Space = string;\nexport type SpaceOrSemicolon = string;\nexport type OpenParen = \"(\";\nexport type CloseParen = \")\";\nexport type AllToken = string;\nexport type AndToken = string;\nexport type AnyToken = string;\nexport type ArrayToken = string;\nexport type AsToken = string;\nexport type AscToken = string;\nexport type BetweenToken = string;\nexport type BothToken = string;\nexport type CaseToken = string;\nexport type CastToken = string;\nexport type CeilToken = string;\nexport type ClusteredByToken = string;\nexport type CountToken = string;\nexport type CsvToken = string;\nexport type CurrentRowToken = string;\nexport type CubeToken = string;\nexport type DateToken = string;\nexport type DescToken = string;\nexport type DistinctToken = string;\nexport type ElseToken = string;\nexport type EndToken = string;\nexport type EscapeToken = string;\nexport type ExplainPlanForToken = string;\nexport type ExtendToken = string;\nexport type ExtractToken = string;\nexport type FalseToken = { value: false; stringValue: string };\nexport type FilterToken = string;\nexport type FloorToken = string;\nexport type FollowingToken = string;\nexport type FromToken = string;\nexport type GroupByToken = string;\nexport type GroupingSetsToken = string;\nexport type HavingToken = string;\nexport type InToken = string;\nexport type InsertToken = string;\nexport type IntervalToken = string;\nexport type IntoToken = string;\nexport type IsToken = string;\nexport type JoinToken = string;\nexport type JsonValueToken = string;\nexport type JsonObjectToken = string;\nexport type KeyToken = string;\nexport type ValueToken = string;\nexport type LeadingToken = string;\nexport type LikeToken = string;\nexport type LimitToken = string;\nexport type NaturalToken = string;\nexport type NotToken = string;\nexport type NullToken = { value: null; stringValue: string };\nexport type OffsetToken = string;\nexport type OnToken = string;\nexport type OrToken = string;\nexport type OrderByToken = string;\nexport type OuterToken = string;\nexport type OverToken = string;\nexport type OverwriteToken = string;\nexport type PartitionedByToken = string;\nexport type PartitionByToken = string;\nexport type PositionToken = string;\nexport type PrecedingToken = string;\nexport type RangeToken = string;\nexport type ReplaceToken = string;\nexport type ReturningToken = string;\nexport type RollupToken = string;\nexport type RowToken = string;\nexport type RowsToken = string;\nexport type SelectToken = string;\nexport type SetToken = string;\nexport type SomeToken = string;\nexport type SymmetricToken = string;\nexport type TableToken = string;\nexport type ThenToken = string;\nexport type TimeToken = string;\nexport type TimestampToken = string;\nexport type TimestampaddToken = string;\nexport type TimestampdiffToken = string;\nexport type ToToken = string;\nexport type TrailingToken = string;\nexport type TrimToken = string;\nexport type TrueToken = { value: true; stringValue: string };\nexport type UnboundedToken = string;\nexport type UnionAllToken = string;\nexport type UsingToken = string;\nexport type ValuesToken = string;\nexport type WhenToken = string;\nexport type WhereToken = string;\nexport type WithToken = string;\n\n\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cleanObject, dedupe, objectMap } from '../utils';\n\nimport type { SeparatedArray } from '.';\nimport { indentLines, SqlColumn, SqlFunction, SqlLiteral, SqlMulti, SqlTable } from '.';\nimport { NEWLINE, SPACE } from './helpers';\nimport { parse as parseSql } from './parser';\n\nexport interface Parens {\n  leftSpacing?: string;\n  rightSpacing?: string;\n}\n\nfunction pseudoRandomCapitalization(str: string): string {\n  const upper = str.toUpperCase();\n  const lower = str.toLowerCase();\n  let seed = 0;\n  return upper\n    .split('')\n    .map((u, i) => {\n      seed += u.charCodeAt(0);\n      seed = (457 * seed + 1279) % 3631;\n      return seed % 5 > 1 ? u : lower[i];\n    })\n    .join('');\n}\n\nexport type Substitutor = (t: SqlBase, stack: SqlBase[]) => SqlBase | undefined;\nexport type Predicate = (t: SqlBase, stack: SqlBase[]) => boolean;\nexport type Matcher<T extends SqlBase> = (t: SqlBase, stack: SqlBase[]) => t is T;\n\nexport interface PrettifyOptions {\n  keywordCasing?: 'preserve';\n  clarifyingParens?: 'disable';\n}\n\nexport type SqlTypeDesignator =\n  | 'base'\n  | 'type'\n  | 'columnList'\n  | 'extendClause'\n  | 'columnDeclaration'\n  | 'record'\n  | 'query'\n  | 'withQuery'\n  | 'values'\n  | 'withClause'\n  | 'whereClause'\n  | 'orderByExpression'\n  | 'fromClause'\n  | 'offsetClause'\n  | 'orderByClause'\n  | 'havingClause'\n  | 'limitClause'\n  | 'groupByClause'\n  | 'insertClause'\n  | 'replaceClause'\n  | 'partitionedByClause'\n  | 'partitionByClause'\n  | 'clusteredByClause'\n  | 'withPart'\n  | 'joinPart'\n  | 'alias'\n  | 'labeledExpression'\n  | 'keyValue'\n  | 'betweenPart'\n  | 'likePart'\n  | 'comparison'\n  | 'literal'\n  | 'placeholder'\n  | 'interval'\n  | 'multi'\n  | 'function'\n  | 'case'\n  | 'whenThenPart'\n  | 'column'\n  | 'star'\n  | 'namespace'\n  | 'table'\n  | 'setStatement'\n  | 'unary'\n  | 'windowSpec'\n  | 'frameBound';\n\nexport type KeywordName =\n  | 'all'\n  | 'and'\n  | 'as'\n  | 'between'\n  | 'case'\n  | 'clusteredBy'\n  | 'currentRow'\n  | 'decorator'\n  | 'direction'\n  | 'else'\n  | 'end'\n  | 'escape'\n  | 'explainPlanFor'\n  | 'extend'\n  | 'filter'\n  | 'following'\n  | 'from'\n  | 'groupBy'\n  | 'having'\n  | 'insert'\n  | 'interval'\n  | 'into'\n  | 'join'\n  | 'joinType'\n  | 'key'\n  | 'limit'\n  | 'natural'\n  | 'offset'\n  | 'on'\n  | 'op'\n  | 'orderBy'\n  | 'over'\n  | 'overwrite'\n  | 'partitionBy'\n  | 'partitionedBy'\n  | 'plan'\n  | 'preceding'\n  | 'range'\n  | 'replace'\n  | 'row'\n  | 'rows'\n  | 'select'\n  | 'set'\n  | 'symmetric'\n  | 'then'\n  | 'timestamp'\n  | 'type'\n  | 'unbounded'\n  | 'union'\n  | 'using'\n  | 'value'\n  | 'values'\n  | 'when'\n  | 'where'\n  | 'with';\n\nexport type SpaceName =\n  | 'final'\n  | 'initial'\n  | 'postAnd'\n  | 'postArguments'\n  | 'postArrow'\n  | 'postAs'\n  | 'postBetween'\n  | 'postBoundValue'\n  | 'postCase'\n  | 'postCaseExpression'\n  | 'postClusteredBy'\n  | 'postColumn'\n  | 'postColumnDeclarations'\n  | 'postColumns'\n  | 'postDecorator'\n  | 'postDot'\n  | 'postElse'\n  | 'postKeyExpression'\n  | 'postEquals'\n  | 'postEscape'\n  | 'postExplainPlanFor'\n  | 'postExpressions'\n  | 'postExtend'\n  | 'postFilter'\n  | 'postFrame'\n  | 'postFrameType'\n  | 'postFrom'\n  | 'postGroupBy'\n  | 'postHaving'\n  | 'postInsert'\n  | 'postInsertClause'\n  | 'postInterval'\n  | 'postIntervalValue'\n  | 'postInto'\n  | 'postJoin'\n  | 'postJoinType'\n  | 'postKey'\n  | 'postLeftParen'\n  | 'postLimit'\n  | 'postNamespace'\n  | 'postNatural'\n  | 'postOffset'\n  | 'postOn'\n  | 'postOp'\n  | 'postOrderBy'\n  | 'postOver'\n  | 'postOverwrite'\n  | 'postPartitionBy'\n  | 'postPartitionedBy'\n  | 'postReplace'\n  | 'postReplaceClause'\n  | 'postRow'\n  | 'postSelect'\n  | 'postSet'\n  | 'postSets'\n  | 'postSymmetric'\n  | 'postTable'\n  | 'postThen'\n  | 'postTimestamp'\n  | 'postUnion'\n  | 'postUsing'\n  | 'postValue'\n  | 'postValues'\n  | 'postWhen'\n  | 'postWhenExpressions'\n  | 'postWhere'\n  | 'postWindowName'\n  | 'postWith'\n  | 'postWithClause'\n  | 'preAlias'\n  | 'preAnd'\n  | 'preArrow'\n  | 'preAs'\n  | 'preClusteredByClause'\n  | 'preColumns'\n  | 'preDirection'\n  | 'preElse'\n  | 'preEnd'\n  | 'preEscape'\n  | 'preExtend'\n  | 'preFilter'\n  | 'preFormat'\n  | 'preFromClause'\n  | 'preGroupByClause'\n  | 'preHavingClause'\n  | 'preJoin'\n  | 'preLeftParen'\n  | 'preLimitClause'\n  | 'preOffsetClause'\n  | 'preOn'\n  | 'preOp'\n  | 'preOrderByClause'\n  | 'preOver'\n  | 'preOverwrite'\n  | 'prePartitionedByClause'\n  | 'preUnion'\n  | 'preUsing'\n  | 'preValueExpression'\n  | 'preWhereClause';\n\nexport interface SqlBaseValue {\n  type?: SqlTypeDesignator;\n  spacing?: Readonly<Partial<Record<SpaceName, string>>>;\n  keywords?: Readonly<Partial<Record<KeywordName, string>>>;\n  parens?: readonly Parens[];\n}\n\nexport abstract class SqlBase {\n  static type: SqlTypeDesignator = 'base';\n\n  static parseSql(input: string | SqlBase): SqlBase {\n    if (typeof input === 'string') {\n      return parseSql(input);\n    } else if (input instanceof SqlBase) {\n      return input;\n    } else {\n      throw new Error('unknown input');\n    }\n  }\n\n  static capitalize: (keyword: string) => string = keyword => {\n    return keyword;\n  };\n\n  static setCapitalization(capitalization: 'upper' | 'lower' | 'title' | 'random'): void {\n    switch (capitalization) {\n      case 'upper':\n        SqlBase.capitalize = k => k;\n        break;\n\n      case 'lower':\n        SqlBase.capitalize = k => k.toLowerCase();\n        break;\n\n      case 'title':\n        SqlBase.capitalize = k => k.slice(0, 1) + k.slice(1).toLowerCase();\n        break;\n\n      case 'random':\n        SqlBase.capitalize = pseudoRandomCapitalization;\n        break;\n\n      default:\n        throw new Error(`unknown capitalization '${capitalization}'`);\n    }\n  }\n\n  static walkSeparatedArray<T extends SqlBase>(\n    a: SeparatedArray<T>,\n    stack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SeparatedArray<T> | undefined {\n    let stop = false;\n    let changed = false;\n    const newA = a.map(v => {\n      if (stop) return v;\n      const ret = v._walkHelper(stack, fn, postorder) as T;\n      if (!ret) {\n        stop = true;\n        return v;\n      }\n      if (ret !== v) {\n        changed = true;\n      }\n      return ret;\n    });\n    if (stop) return undefined;\n    return changed ? newA : a;\n  }\n\n  static normalizeKeywordSpace(keyword: string): string {\n    return keyword\n      .replace(/\\/\\*.*\\*\\//g, ' ')\n      .replace(/--[^\\n]*\\n/gm, ' ')\n      .replace(/\\s+/gm, ' ');\n  }\n\n  static classMap: Record<string, typeof SqlBase> = {};\n  static register(ex: typeof SqlBase): void {\n    SqlBase.classMap[ex.type] = ex;\n  }\n\n  static getConstructorFor(type: SqlTypeDesignator): typeof SqlBase {\n    const ClassFn = SqlBase.classMap[type];\n    if (!ClassFn) throw new Error(`unsupported expression type '${type}'`);\n    return ClassFn;\n  }\n\n  static fromValue(parameters: SqlBaseValue): any {\n    const { type } = parameters;\n    if (!type) throw new Error(`must set 'type' to use fromValue`);\n    const ClassFn = SqlBase.getConstructorFor(type) as any;\n    return new ClassFn(parameters);\n  }\n\n  public type: SqlTypeDesignator;\n  public spacing: Readonly<Record<string, string>>;\n  public keywords: Readonly<Record<string, string>>;\n  public parens?: readonly Parens[];\n\n  constructor(options: SqlBaseValue, typeOverride: SqlTypeDesignator) {\n    const type = typeOverride || options.type;\n    if (!type) throw new Error(`could not determine type`);\n    this.type = type;\n    this.spacing = cleanObject(options.spacing || {});\n    this.keywords = cleanObject(options.keywords || {});\n    this.parens = options.parens;\n  }\n\n  public valueOf() {\n    const value: SqlBaseValue = {\n      type: this.type,\n      spacing: this.spacing,\n      keywords: this.keywords,\n    };\n    if (this.parens) value.parens = this.parens;\n    return value;\n  }\n\n  public toJSON() {\n    return this.toString();\n  }\n\n  public equals(other: SqlBase | undefined): boolean {\n    if (!other) return false;\n    if (this === other) return true;\n    if (this.type !== other.type) return false;\n    return this.toString() === other.toString(); // ToDo: make this not use toString\n  }\n\n  public logicalEquals(other: SqlBase | undefined): boolean {\n    if (!other) return false;\n    if (this === other) return true;\n    if (this.type !== other.type) return false;\n    return this.prettify().toString() === other.prettify().toString(); // ToDo: make this not use toString\n  }\n\n  public getParens(): readonly Parens[] {\n    return this.parens || [];\n  }\n\n  public hasParens(): boolean {\n    return Boolean(this.getParens().length);\n  }\n\n  public changeParens(parens: readonly Parens[]): this {\n    const newParens = parens.length ? parens : undefined;\n    if (this.parens === newParens) return this;\n    const value = this.valueOf();\n    value.parens = newParens;\n    return SqlBase.fromValue(value);\n  }\n\n  public addParens(leftSpacing?: string, rightSpacing?: string): this {\n    return this.changeParens(\n      this.getParens().concat({\n        leftSpacing,\n        rightSpacing,\n      }),\n    );\n  }\n\n  public ensureParens(leftSpacing?: string, rightSpacing?: string): this {\n    if (this.parens) return this;\n    return this.addParens(leftSpacing, rightSpacing);\n  }\n\n  public removeOwnParenSpaces(): this {\n    if (!this.parens) return this;\n    return this.changeParens(this.parens.map(() => ({})));\n  }\n\n  public resetOwnSpacing(): this {\n    if (Object.keys(this.spacing).length === 0) return this;\n    const value = this.valueOf();\n    value.spacing = {};\n    return SqlBase.fromValue(value);\n  }\n\n  public resetOwnKeywords(): this {\n    if (Object.keys(this.keywords).length === 0) return this;\n    const value = this.valueOf();\n    value.keywords = {};\n    return SqlBase.fromValue(value);\n  }\n\n  public normalizeOwnKeywordSpaces(): this {\n    if (Object.keys(this.keywords).length === 0) return this;\n    const value = this.valueOf();\n    value.keywords = objectMap(value.keywords || {}, SqlBase.normalizeKeywordSpace);\n    return SqlBase.fromValue(value);\n  }\n\n  public clearOwnSeparators(): this {\n    return this;\n  }\n\n  public getSpace(name: SpaceName, defaultSpace = SPACE) {\n    const s = this.spacing[name] as string | undefined;\n    return typeof s === 'string' ? s : defaultSpace;\n  }\n\n  public changeSpace(name: SpaceName, space: string): this {\n    return this.changeSpaces({ [name]: space });\n  }\n\n  public changeSpaces(newSpacing: Partial<Record<SpaceName, string>>): this {\n    const value = this.valueOf();\n    value.spacing = { ...value.spacing, ...newSpacing };\n    return SqlBase.fromValue(value);\n  }\n\n  protected getSpacingWithout(...toRemove: SpaceName[]) {\n    const ret = { ...this.spacing };\n    for (const thing of toRemove) {\n      delete ret[thing];\n    }\n    return ret;\n  }\n\n  public getKeyword(\n    name: KeywordName,\n    defaultKeyword: string,\n    followSpace?: SpaceName,\n    defaultFollowSpace?: string,\n  ): string {\n    let keyword = this.keywords[name];\n    if (typeof keyword === 'undefined') keyword = SqlBase.capitalize(defaultKeyword);\n    if (keyword && followSpace) keyword += this.getSpace(followSpace, defaultFollowSpace);\n    return keyword;\n  }\n\n  protected getKeywordsWithout(...toRemove: KeywordName[]) {\n    const ret = { ...this.keywords };\n    for (const thing of toRemove) {\n      delete ret[thing];\n    }\n    return ret;\n  }\n\n  protected abstract _toRawString(): string;\n\n  public toString(): string {\n    const { parens } = this;\n    let str = this._toRawString();\n    if (parens) {\n      const isMultiline = str.includes(NEWLINE);\n      for (const paren of parens) {\n        const { leftSpacing, rightSpacing } = paren;\n        if (\n          typeof leftSpacing === 'undefined' &&\n          typeof rightSpacing === 'undefined' &&\n          isMultiline\n        ) {\n          str = `(${NEWLINE}${indentLines(str)}${NEWLINE})`;\n        } else {\n          str = `(${leftSpacing || ''}${str}${rightSpacing || ''})`;\n        }\n      }\n    }\n    return this.getSpace('initial', '') + str + this.getSpace('final', '');\n  }\n\n  public walk(fn: Substitutor): SqlBase {\n    const ret = this._walkHelper([], fn, false);\n    if (!ret) return this;\n    return ret;\n  }\n\n  public walkPostorder(fn: Substitutor): SqlBase {\n    const ret = this._walkHelper([], fn, true);\n    if (!ret) return this;\n    return ret;\n  }\n\n  public _walkHelper(stack: SqlBase[], fn: Substitutor, postorder: boolean): SqlBase | undefined {\n    let ret: SqlBase | undefined = this;\n\n    if (!postorder) {\n      ret = fn(ret, stack);\n      if (!ret) return;\n      if (ret !== this) return ret; // In a preorder scan we do not want to scan replacement inner object if it has changed\n    }\n\n    ret = ret._walkInner([ret].concat(stack), fn, postorder);\n    if (!ret) return;\n\n    if (postorder) {\n      ret = fn(ret, stack);\n      if (!ret) return;\n    }\n\n    return ret;\n  }\n\n  public _walkInner(\n    _nextStack: SqlBase[],\n    _fn: Substitutor,\n    _postorder: boolean,\n  ): SqlBase | undefined {\n    return this;\n  }\n\n  public isPart(): boolean {\n    return this.type.endsWith('Part');\n  }\n\n  public some(fn: Predicate): boolean {\n    let some = false;\n    this.walk((b, s) => {\n      some = some || fn(b, s);\n      return some ? undefined : b;\n    });\n    return some;\n  }\n\n  public every(fn: Predicate): boolean {\n    let every = true;\n    this.walk((b, s) => {\n      every = every && fn(b, s);\n      return every ? b : undefined;\n    });\n    return every;\n  }\n\n  public collect<T extends SqlBase>(fn: Matcher<T>): T[] {\n    const collected: T[] = [];\n    this.walk((b, s) => {\n      if (fn(b, s)) {\n        collected.push(b);\n      }\n      return b;\n    });\n    return collected;\n  }\n\n  public find<T extends SqlBase>(fn: Matcher<T>): T | undefined {\n    let found: T | undefined;\n    this.walk((b, s) => {\n      if (fn(b, s)) {\n        found = b;\n        return;\n      }\n      return b;\n    });\n    return found;\n  }\n\n  public getColumns(): SqlColumn[] {\n    return this.collect((b): b is SqlColumn => b instanceof SqlColumn);\n  }\n\n  public getUsedColumnNames(): string[] {\n    return dedupe(this.getColumns().map(x => x.getName())).sort();\n  }\n\n  public getTables(): SqlTable[] {\n    return this.collect((b): b is SqlTable => b instanceof SqlTable);\n  }\n\n  public getUsedTableNames(): string[] {\n    return dedupe(this.getTables().map(x => x.getName())).sort();\n  }\n\n  public getFirstTableName(): string | undefined {\n    return this.find((b): b is SqlTable => b instanceof SqlTable)?.getName();\n  }\n\n  public getFirstSchema(): string | undefined {\n    return this.find(\n      (b): b is SqlTable => b instanceof SqlTable && Boolean(b.namespace),\n    )?.getNamespaceName();\n  }\n\n  public contains(thing: SqlBase): boolean {\n    return this.some(b => b.equals(thing));\n  }\n\n  public containsColumnName(columnName: string): boolean {\n    return this.some(b => b instanceof SqlColumn && b.getName() === columnName);\n  }\n\n  public containsFunction(functionName: string): boolean {\n    functionName = functionName.toUpperCase();\n    return this.some(\n      ex => ex instanceof SqlFunction && ex.getEffectiveFunctionName() === functionName,\n    );\n  }\n\n  public getFirstColumnName(): string | undefined {\n    const column = this.getColumns()[0];\n    if (!column) return;\n    return column.getName();\n  }\n\n  public addClarifyingParens(): this {\n    return this.walk((ex, stack) => {\n      if (ex instanceof SqlMulti && (ex.op === 'AND' || ex.op === 'OR') && !ex.hasParens()) {\n        const parent = stack[0];\n        if (parent instanceof SqlMulti && (parent.op === 'AND' || parent.op === 'OR')) {\n          return ex.addParens();\n        }\n      }\n      return ex;\n    }) as any;\n  }\n\n  public prettify(options: PrettifyOptions = {}): this {\n    const { keywordCasing, clarifyingParens } = options;\n    return this.applyIf(clarifyingParens !== 'disable', ex =>\n      ex.addClarifyingParens(),\n    ).walkPostorder(ex => {\n      const resetSpaceEx = ex.resetOwnSpacing().clearOwnSeparators().removeOwnParenSpaces();\n      return keywordCasing === 'preserve'\n        ? resetSpaceEx.normalizeOwnKeywordSpaces()\n        : resetSpaceEx.resetOwnKeywords();\n    }) as any;\n  }\n\n  public prettyTrim(maxLength: number): this {\n    return this.walk(ex => {\n      if (ex instanceof SqlLiteral || ex instanceof SqlColumn) {\n        return ex.prettyTrim(maxLength);\n      }\n      return ex;\n    }) as any;\n  }\n\n  public apply<T>(fn: (self: this) => T): T {\n    return fn(this);\n  }\n\n  public applyIf<T>(\n    condition: unknown,\n    thenFn: (self: this) => T,\n    elseFn?: (self: this) => T,\n  ): T | this {\n    if (condition) {\n      return thenFn(this);\n    } else if (elseFn) {\n      return elseFn(this);\n    } else {\n      return this;\n    }\n  }\n\n  public applyForEach<T>(\n    things: readonly T[],\n    fn: (self: this, thing: T, index: number) => this,\n  ): this {\n    return things.reduce(fn, this);\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LiteralValue, RefName, SqlMultiOp, SqlOrderByDirection, SqlType } from '.';\nimport {\n  SqlAlias,\n  SqlColumn,\n  SqlComparison,\n  SqlFunction,\n  SqlLiteral,\n  SqlMulti,\n  SqlOrderByExpression,\n  SqlPlaceholder,\n  SqlUnary,\n} from '.';\nimport { parse as parseSql } from './parser';\nimport type { Substitutor } from './sql-base';\nimport { SqlBase } from './sql-base';\n\nexport interface DecomposeViaOptions {\n  flatten?: boolean;\n  preserveParens?: boolean;\n}\n\nexport abstract class SqlExpression extends SqlBase {\n  static parse(input: string | SqlExpression): SqlExpression {\n    if (typeof input === 'string') {\n      const parsed = parseSql(input);\n      if (!(parsed instanceof SqlExpression)) {\n        throw new Error('Provided SQL was not an expression');\n      }\n      return parsed;\n    } else if (input instanceof SqlExpression) {\n      return input;\n    } else {\n      throw new Error('unknown input');\n    }\n  }\n\n  static maybeParse(input: string | SqlExpression): SqlExpression | undefined {\n    try {\n      return SqlExpression.parse(input);\n    } catch {\n      return;\n    }\n  }\n\n  static wrap(input: SqlExpression | LiteralValue): SqlExpression {\n    return input instanceof SqlExpression ? input : SqlLiteral.create(input);\n  }\n\n  static verify(input: SqlExpression): SqlExpression {\n    if (input instanceof SqlExpression) return input;\n    throw new TypeError('must be a SqlExpression');\n  }\n\n  static and(...args: (SqlExpression | undefined)[]): SqlExpression {\n    return SqlMulti.createIfNeeded(\n      'AND',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlLiteral && a.value === true) {\n          return []; // Skip no-op TRUE this is a special case\n        }\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('AND');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static or(...args: (SqlExpression | undefined)[]): SqlExpression {\n    return SqlMulti.createIfNeeded(\n      'OR',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlLiteral && a.value === false) {\n          return []; // Skip no-op FALSE this is a special case\n        }\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('OR');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static concat(...args: (SqlExpression | undefined)[]): SqlExpression {\n    return SqlMulti.createIfNeeded(\n      '||',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('||');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static add(...args: (SqlExpression | undefined)[]): SqlExpression {\n    return SqlMulti.createIfNeeded(\n      '+',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('+');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static subtract(...args: (SqlExpression | undefined)[]): SqlExpression {\n    if (!args[0]) throw new Error('first argument to subtract must be defined');\n    return SqlMulti.createIfNeeded(\n      '-',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('+');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static multiply(...args: (SqlExpression | undefined)[]): SqlExpression {\n    return SqlMulti.createIfNeeded(\n      '*',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('*');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static divide(...args: (SqlExpression | undefined)[]): SqlExpression {\n    if (!args[0]) throw new Error('first argument to divide must be defined');\n    return SqlMulti.createIfNeeded(\n      '/',\n      args.flatMap(a => {\n        if (a == null) return [];\n        if (a instanceof SqlMulti) return a.flattenIfNeeded('*');\n        return SqlExpression.verify(a);\n      }),\n    );\n  }\n\n  static fromTimeExpressionAndInterval(\n    time: SqlExpression,\n    interval: string | string[],\n  ): SqlExpression {\n    if (Array.isArray(interval)) {\n      return SqlExpression.or(\n        ...interval.map(int => SqlExpression.fromTimeExpressionAndInterval(time, int)),\n      );\n    }\n\n    const parts = interval.split('/');\n    if (parts.length !== 2) throw new Error(`can not convert interval: ${interval}`);\n\n    const start = new Date(parts[0]!);\n    if (isNaN(start.valueOf())) throw new Error(`can not parse the start of interval: ${interval}`);\n\n    const end = new Date(parts[1]!);\n    if (isNaN(end.valueOf())) throw new Error(`can not parse the end of interval: ${interval}`);\n\n    return SqlLiteral.create(start)\n      .lessThanOrEqual(time)\n      .and(time.lessThan(SqlLiteral.create(end)));\n  }\n\n  static arrayOfLiterals(xs: LiteralValue[]) {\n    return SqlFunction.array(...xs);\n  }\n\n  // ------------------------------\n\n  public _walkHelper(\n    stack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    const ret = super._walkHelper(stack, fn, postorder);\n    if (!ret) return;\n    if (ret === this) return this;\n    if (ret instanceof SqlExpression) {\n      return ret;\n    } else {\n      throw new Error('expression walker must return a SQL expression');\n    }\n  }\n\n  public _walkInner(\n    _nextStack: SqlBase[],\n    _fn: Substitutor,\n    _postorder: boolean,\n  ): SqlExpression | undefined {\n    return this;\n  }\n\n  // Alias\n\n  public as(alias: RefName | string, forceQuotes?: boolean): SqlAlias {\n    return SqlAlias.create(this, alias, forceQuotes);\n  }\n\n  public setAlias(alias: RefName | string | undefined, forceQuotes?: boolean): SqlExpression {\n    if (!alias) return this.getUnderlyingExpression();\n    return SqlAlias.create(this, alias, forceQuotes);\n  }\n\n  public ifUnnamedAliasAs(alias: RefName | string, forceQuotes?: boolean): SqlExpression {\n    return SqlAlias.create(this, alias, forceQuotes);\n  }\n\n  public getUnderlyingExpression(): SqlExpression {\n    return this;\n  }\n\n  public changeUnderlyingExpression(newExpression: SqlExpression): SqlExpression {\n    return newExpression;\n  }\n\n  public getOutputName(): string | undefined {\n    return;\n  }\n\n  public convertToTable(): SqlExpression {\n    return this;\n  }\n\n  public toOrderByExpression(direction?: SqlOrderByDirection): SqlOrderByExpression {\n    return SqlOrderByExpression.create(this, direction);\n  }\n\n  // SqlUnary\n\n  public not(): SqlUnary {\n    return SqlUnary.not(this);\n  }\n\n  public negate(): SqlExpression {\n    return this.not();\n  }\n\n  // SqlComparison\n\n  public equal(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.equal(this, rhs);\n  }\n\n  public unequal(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.unequal(this, rhs);\n  }\n\n  public lessThan(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.lessThan(this, rhs);\n  }\n\n  public greaterThan(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.greaterThan(this, rhs);\n  }\n\n  public lessThanOrEqual(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.lessThanOrEqual(this, rhs);\n  }\n\n  public greaterThanOrEqual(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.greaterThanOrEqual(this, rhs);\n  }\n\n  public isNull(): SqlComparison {\n    return SqlComparison.isNull(this);\n  }\n\n  public isNotNull(): SqlComparison {\n    return SqlComparison.isNotNull(this);\n  }\n\n  public isNotDistinctFrom(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.isNotDistinctFrom(this, rhs);\n  }\n\n  public isDistinctFrom(rhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.isDistinctFrom(this, rhs);\n  }\n\n  public in(values: (SqlExpression | LiteralValue)[]): SqlComparison {\n    return SqlComparison.in(this, values);\n  }\n\n  public notIn(values: (SqlExpression | LiteralValue)[]): SqlComparison {\n    return SqlComparison.notIn(this, values);\n  }\n\n  public like(rhs: SqlExpression | string, escape?: SqlExpression | string): SqlComparison {\n    return SqlComparison.like(this, rhs, escape);\n  }\n\n  public between(\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.between(this, start, end);\n  }\n\n  public notBetween(\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.notBetween(this, start, end);\n  }\n\n  public betweenSymmetric(\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.betweenSymmetric(this, start, end);\n  }\n\n  public notBetweenSymmetric(\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.notBetweenSymmetric(this, start, end);\n  }\n\n  // SqlMulti\n\n  public and(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.and(this, ...expressions);\n  }\n\n  public or(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.or(this, ...expressions);\n  }\n\n  public concat(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.concat(this, ...expressions);\n  }\n\n  public add(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.add(this, ...expressions);\n  }\n\n  public subtract(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.subtract(this, ...expressions);\n  }\n\n  public multiply(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.multiply(this, ...expressions);\n  }\n\n  public divide(...expressions: SqlExpression[]): SqlExpression {\n    return SqlExpression.divide(this, ...expressions);\n  }\n\n  public flatten(_flatteningOp?: SqlMultiOp): SqlExpression {\n    return this;\n  }\n\n  public decomposeViaAnd(_options?: DecomposeViaOptions): SqlExpression[] {\n    return [this];\n  }\n\n  public decomposeViaOr(_options?: DecomposeViaOptions): SqlExpression[] {\n    return [this];\n  }\n\n  public filterAnd(fn: (ex: SqlExpression) => boolean): SqlExpression | undefined {\n    if (!fn(this)) return;\n    return this;\n  }\n\n  public removeColumnFromAnd(column: string): SqlExpression | undefined {\n    return this.filterAnd(ex => !ex.containsColumnName(column));\n  }\n\n  public fillPlaceholders(fillWith: (SqlExpression | LiteralValue)[]): SqlExpression {\n    let i = 0;\n    return this.walk(ex => {\n      if (ex instanceof SqlPlaceholder) {\n        if (i === fillWith.length) {\n          return ex;\n        }\n\n        return SqlExpression.wrap(fillWith[i++]!); // We checked above that i is in range\n      }\n      return ex;\n    }) as SqlExpression;\n  }\n\n  // SqlFunction\n\n  public cast(asType: SqlType | string): SqlExpression {\n    return SqlFunction.cast(this, asType);\n  }\n\n  // Logic\n\n  public addFilterToAggregations(\n    filter: SqlExpression,\n    knownAggregations: string[],\n  ): SqlExpression {\n    return this.walk(x => {\n      if (x instanceof SqlFunction) {\n        if (x.isAggregation(knownAggregations)) return x.addWhereExpression(filter);\n\n        const { args } = x;\n        if (!args) return x;\n\n        try {\n          return x.changeArgs(\n            args.map(a => {\n              return a.addFilterToAggregations(filter, knownAggregations);\n            }),\n          );\n        } catch (e: any) {\n          if (e.message === 'column reference outside aggregation') {\n            return x.addWhereExpression(filter);\n          }\n          throw e;\n        }\n      } else if (x instanceof SqlColumn) {\n        throw new Error('column reference outside aggregation');\n      }\n      return x;\n    }) as SqlExpression;\n  }\n\n  /**\n   * Updates a specific clause\n   * @param clause the new clause to add\n   * @returns the updated where clause\n   * @deprecated\n   */\n  public changeClauseInWhere(clause: SqlExpression | string) {\n    const parsed = SqlExpression.parse(clause);\n    if (String(this) === 'TRUE') {\n      return parsed;\n    } else {\n      let currentClauses = this.decomposeViaAnd();\n\n      const usedColumnNames = parsed.getUsedColumnNames();\n      if (usedColumnNames.length === 1) {\n        const clauseColumn = usedColumnNames[0];\n        currentClauses = currentClauses.filter(c => {\n          const cUsedColumn = c.getUsedColumnNames();\n          return cUsedColumn.length !== 1 || cUsedColumn[0] !== clauseColumn;\n        });\n      }\n\n      return SqlExpression.and(...currentClauses, parsed);\n    }\n  }\n\n  /**\n   * Toggles a specific clause\n   * @param clause the clause to toggle\n   * @returns the updated where clause\n   * @deprecated\n   */\n  public toggleClauseInWhere(clause: SqlExpression | string) {\n    const parsed = SqlExpression.parse(clause);\n    if (String(this) === 'TRUE') {\n      return parsed;\n    } else {\n      const currentClauses = this.decomposeViaAnd();\n      const currentClausesWithoutClause = currentClauses.filter(c => !c.equals(parsed));\n\n      if (currentClauses.length === currentClausesWithoutClause.length) {\n        return SqlExpression.and(...currentClauses, parsed);\n      } else {\n        return SqlExpression.and(...currentClausesWithoutClause);\n      }\n    }\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\n\nexport interface SqlTypeValue extends SqlBaseValue {\n  value: string;\n}\n\nexport class SqlType extends SqlExpression {\n  static type: SqlTypeDesignator = 'type';\n\n  static VARCHAR: SqlType;\n  static VARCHAR_ARRAY: SqlType;\n  static DOUBLE: SqlType;\n  static DOUBLE_ARRAY: SqlType;\n  static FLOAT: SqlType;\n  static BIGINT: SqlType;\n  static BIGINT_ARRAY: SqlType;\n  static TIMESTAMP: SqlType;\n\n  static makeEffectiveType(type: string): string {\n    const m = /^TYPE\\((.+)\\)$/i.exec(type);\n    if (m) return `TYPE(${m[1]})`;\n    return SqlBase.normalizeKeywordSpace(type.toUpperCase());\n  }\n\n  static create(value: string | SqlType): SqlType {\n    if (value instanceof SqlType) return value;\n\n    const effectiveValue = SqlType.makeEffectiveType(value);\n    return new SqlType({\n      value: effectiveValue,\n      keywords: effectiveValue !== value ? { type: value } : undefined,\n    });\n  }\n\n  static fromNativeType(value: string): SqlType {\n    switch (value.toLowerCase()) {\n      case 'string':\n        return SqlType.VARCHAR;\n\n      case 'array<string>':\n        return SqlType.VARCHAR_ARRAY;\n\n      case 'double':\n        return SqlType.DOUBLE;\n\n      case 'array<double>':\n        return SqlType.DOUBLE_ARRAY;\n\n      case 'float':\n        return SqlType.FLOAT;\n\n      case 'long':\n        return SqlType.BIGINT;\n\n      case 'array<long>':\n        return SqlType.BIGINT_ARRAY;\n\n      case 'complex<json>':\n        return SqlType.create(`TYPE('COMPLEX<json>')`);\n\n      default:\n        return SqlType.VARCHAR;\n    }\n  }\n\n  public readonly value: string;\n\n  constructor(options: SqlTypeValue) {\n    super(options, SqlType.type);\n    this.value = options.value;\n  }\n\n  public valueOf(): SqlTypeValue {\n    const value = super.valueOf() as SqlTypeValue;\n    value.value = this.value;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return this.getKeyword('type', this.value);\n  }\n\n  public getEffectiveType(): string {\n    return this.value;\n  }\n\n  public getNativeType(): string {\n    const sqlType = this.value;\n    switch (sqlType) {\n      case 'VARCHAR':\n        return 'string';\n\n      case 'VARCHAR ARRAY':\n        return 'ARRAY<string>';\n\n      case 'DOUBLE':\n      case 'FLOAT':\n        return sqlType.toLowerCase();\n\n      case 'DOUBLE ARRAY':\n        return 'ARRAY<double>';\n\n      case 'TIMESTAMP':\n      case 'BIGINT':\n        return 'long';\n\n      case 'BIGINT ARRAY':\n        return 'ARRAY<long>';\n\n      case `TYPE('COMPLEX<json>')`:\n        return 'COMPLEX<json>';\n\n      default:\n        return 'string';\n    }\n  }\n\n  public isArray(): boolean {\n    return this.value.endsWith(' ARRAY');\n  }\n}\n\nSqlBase.register(SqlType);\n\nSqlType.VARCHAR = SqlType.create('VARCHAR');\nSqlType.VARCHAR_ARRAY = SqlType.create('VARCHAR ARRAY');\nSqlType.DOUBLE = SqlType.create('DOUBLE');\nSqlType.DOUBLE_ARRAY = SqlType.create('DOUBLE ARRAY');\nSqlType.FLOAT = SqlType.create('FLOAT');\nSqlType.BIGINT = SqlType.create('BIGINT');\nSqlType.BIGINT_ARRAY = SqlType.create('BIGINT ARRAY');\nSqlType.TIMESTAMP = SqlType.create('TIMESTAMP');\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { RefName } from '../helpers';\nimport { SeparatedArray, Separator } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\n\nexport interface SqlColumnListValue extends SqlBaseValue {\n  columns: SeparatedArray<RefName>;\n}\n\nexport class SqlColumnList extends SqlBase {\n  static type: SqlTypeDesignator = 'columnList';\n\n  static create(columns: SqlColumnList | SeparatedArray<RefName> | RefName[]): SqlColumnList {\n    if (columns instanceof SqlColumnList) return columns;\n    return new SqlColumnList({\n      columns: SeparatedArray.fromArray(columns),\n    }).ensureParens();\n  }\n\n  public readonly columns: SeparatedArray<RefName>;\n\n  constructor(options: SqlColumnListValue) {\n    super(options, SqlColumnList.type);\n    this.columns = options.columns;\n  }\n\n  public valueOf(): SqlColumnListValue {\n    const value = super.valueOf() as SqlColumnListValue;\n    value.columns = this.columns;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return this.columns.toString(Separator.COMMA);\n  }\n\n  public changeColumns(columns: SeparatedArray<RefName> | RefName[]): this {\n    const value = this.valueOf();\n    value.columns = SeparatedArray.fromArray(columns);\n    return SqlBase.fromValue(value);\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.columns = this.columns.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlColumnList);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\n\nexport interface SqlPlaceholderValue extends SqlBaseValue {\n  customPlaceholder?: string;\n}\n\nexport class SqlPlaceholder extends SqlExpression {\n  static type: SqlTypeDesignator = 'placeholder';\n\n  static PLACEHOLDER: SqlPlaceholder;\n\n  public readonly customPlaceholder?: string;\n\n  constructor(options: SqlPlaceholderValue = {}) {\n    super(options, SqlPlaceholder.type);\n    this.customPlaceholder = options.customPlaceholder;\n  }\n\n  public valueOf(): SqlPlaceholderValue {\n    const value = super.valueOf() as SqlPlaceholderValue;\n    value.customPlaceholder = this.customPlaceholder;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return this.customPlaceholder || '?';\n  }\n\n  public changeCustomPlaceholder(customPlaceholder: string | undefined): SqlPlaceholder {\n    const value = this.valueOf();\n    value.customPlaceholder = customPlaceholder;\n    return new SqlPlaceholder(value);\n  }\n}\n\nSqlBase.register(SqlPlaceholder);\n\nSqlPlaceholder.PLACEHOLDER = new SqlPlaceholder();\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isDate, isInteger } from '../../utils';\nimport { needsUnicodeEscape, sqlEscapeUnicode, trimString } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { DecomposeViaOptions } from '../sql-expression';\nimport { SqlExpression } from '../sql-expression';\n\nexport type LiteralValue = null | boolean | number | bigint | string | Date;\n\nexport interface SqlLiteralValue extends SqlBaseValue {\n  value: LiteralValue;\n  stringValue?: string;\n}\n\nexport class SqlLiteral extends SqlExpression {\n  static type: SqlTypeDesignator = 'literal';\n\n  static DEFAULT_TIMESTAMP_KEYWORD = 'TIMESTAMP';\n  static DEFAULT_NULL_KEYWORD = 'NULL';\n  static DEFAULT_FALSE_KEYWORD = 'FALSE';\n  static DEFAULT_TRUE_KEYWORD = 'TRUE';\n\n  static NULL: SqlLiteral;\n  static FALSE: SqlLiteral;\n  static TRUE: SqlLiteral;\n  static ZERO: SqlLiteral;\n  static ZERO_POINT_ZERO: SqlLiteral;\n  static ONE: SqlLiteral;\n  static ONE_POINT_ZERO: SqlLiteral;\n  static EMPTY_STRING: SqlLiteral;\n\n  static create(value: LiteralValue | SqlLiteral): SqlLiteral {\n    if (value instanceof SqlLiteral) return value;\n\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (typeof value) {\n      case 'object':\n        if (value !== null && !isDate(value)) {\n          throw new TypeError('SqlLiteral invalid object input');\n        }\n        break;\n\n      case 'number':\n        if (!isFinite(value)) {\n          throw new TypeError(`SqlLiteral invalid numeric input ${value}`);\n        }\n        break;\n\n      case 'boolean':\n      case 'bigint':\n      case 'string':\n        break; // Nothing to do here\n\n      default:\n        throw new TypeError(`SqlLiteral invalid input of type ${typeof value}`);\n    }\n\n    return new SqlLiteral({\n      value,\n    });\n  }\n\n  static double(value: number): SqlLiteral {\n    // Make sure to record the string value of a double with a `.` even if the number itself happens to be an integer.\n    return new SqlLiteral({\n      value,\n      stringValue: isInteger(value) ? value.toFixed(1) : undefined,\n    });\n  }\n\n  static maybe(value: any): SqlLiteral | undefined {\n    try {\n      return SqlLiteral.create(value);\n    } catch {\n      return;\n    }\n  }\n\n  static index(n: number): SqlLiteral {\n    return SqlLiteral.create(n + 1);\n  }\n\n  static direct(v: string | SqlLiteral): SqlLiteral {\n    if (v instanceof SqlLiteral) return v;\n    return new SqlLiteral({\n      value: v.toUpperCase(),\n      stringValue: v,\n    });\n  }\n\n  static escapeLiteralString(str: string): string {\n    str = str.replace(/'/g, \"''\");\n    if (needsUnicodeEscape(str)) {\n      return `U&'${sqlEscapeUnicode(str)}'`;\n    } else {\n      return `'${str}'`;\n    }\n  }\n\n  static dateToTimestampValue(date: Date): string {\n    return date\n      .toISOString()\n      .replace('T', ' ')\n      .replace('Z', '')\n      .replace(/\\.000$/, '')\n      .replace(/ 00:00:00$/, '');\n  }\n\n  static isTrue(ex: SqlExpression): ex is SqlLiteral {\n    return ex instanceof SqlLiteral && ex.value === true;\n  }\n\n  static _equalsLiteral(expression: SqlBase, value: number) {\n    return expression instanceof SqlLiteral && expression.value === value;\n  }\n\n  public readonly value: LiteralValue;\n  public readonly stringValue?: string;\n\n  constructor(options: SqlLiteralValue) {\n    super(options, SqlLiteral.type);\n    this.value = options.value;\n    this.stringValue = options.stringValue;\n  }\n\n  public valueOf(): SqlLiteralValue {\n    const value = super.valueOf() as SqlLiteralValue;\n    value.value = this.value;\n    value.stringValue = this.stringValue;\n    return value;\n  }\n\n  public getEffectiveStringValue(): string {\n    const { value, stringValue } = this;\n    if (stringValue) return stringValue;\n\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (typeof value) {\n      case 'object':\n        if (value === null) {\n          return SqlBase.capitalize(SqlLiteral.DEFAULT_NULL_KEYWORD);\n        } else if (isDate(value)) {\n          return `'${SqlLiteral.dateToTimestampValue(value)}'`;\n        } else {\n          return String(value);\n        }\n\n      case 'boolean':\n        return SqlBase.capitalize(\n          value ? SqlLiteral.DEFAULT_TRUE_KEYWORD : SqlLiteral.DEFAULT_FALSE_KEYWORD,\n        );\n\n      case 'string':\n        return SqlLiteral.escapeLiteralString(value);\n\n      default:\n        return String(value);\n    }\n  }\n\n  protected _toRawString(): string {\n    const retParts: string[] = [];\n\n    if (this.isDate()) {\n      retParts.push(\n        this.getKeyword('timestamp', SqlLiteral.DEFAULT_TIMESTAMP_KEYWORD),\n        this.getSpace('postTimestamp'),\n      );\n    }\n\n    retParts.push(this.getEffectiveStringValue());\n\n    return retParts.join('');\n  }\n\n  public resetOwnKeywords(): this {\n    const { value, stringValue } = this;\n    if (stringValue && (value === null || typeof value === 'boolean')) {\n      const v = this.valueOf();\n      delete v.stringValue;\n      return new SqlLiteral(v).resetOwnKeywords() as this;\n    } else {\n      return super.resetOwnKeywords();\n    }\n  }\n\n  public isIndex(): boolean {\n    return typeof this.value === 'number';\n  }\n\n  public getIndexValue(): number {\n    const { value } = this;\n    if (typeof value !== 'number') return -1;\n    return Math.floor(value - 1);\n  }\n\n  public incrementIndex(amount = 1): SqlLiteral {\n    if (!this.isIndex()) return this;\n    const value = this.valueOf();\n    value.value = Math.floor(this.value as number) + amount;\n    delete value.stringValue;\n    return new SqlLiteral(value);\n  }\n\n  public prettyTrim(maxLength: number): this {\n    if (typeof this.value === 'string') {\n      return SqlLiteral.create(trimString(this.value, maxLength)) as any;\n    }\n    return this;\n  }\n\n  public decomposeViaAnd(_options?: DecomposeViaOptions): SqlExpression[] {\n    return this.value === true ? [] : [this];\n  }\n\n  public isInteger(): boolean {\n    const { value, stringValue } = this;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (typeof value) {\n      case 'number':\n        if (typeof stringValue === 'string') {\n          return !stringValue.includes('.');\n        }\n        return isInteger(value);\n\n      case 'bigint':\n        return true;\n\n      default:\n        return false;\n    }\n  }\n\n  public isDate(): boolean {\n    return isDate(this.value);\n  }\n\n  public getNumberValue(): number | undefined {\n    const { value } = this;\n    if (typeof value !== 'number') return;\n    return value;\n  }\n\n  public getNumberOrBigintValue(): number | bigint | undefined {\n    const { value } = this;\n    if (typeof value !== 'number' && typeof value !== 'bigint') return;\n    return value;\n  }\n\n  public getStringValue(): string | undefined {\n    const { value } = this;\n    if (typeof value !== 'string') return;\n    return value;\n  }\n\n  public getDateValue(): Date | undefined {\n    const { value } = this;\n    if (!isDate(value)) return;\n    return value;\n  }\n}\n\nSqlBase.register(SqlLiteral);\n\nSqlLiteral.NULL = SqlLiteral.create(null);\nSqlLiteral.FALSE = SqlLiteral.create(false);\nSqlLiteral.TRUE = SqlLiteral.create(true);\nSqlLiteral.ZERO = SqlLiteral.create(0);\nSqlLiteral.ZERO_POINT_ZERO = SqlLiteral.double(0);\nSqlLiteral.ONE = SqlLiteral.create(1);\nSqlLiteral.ONE_POINT_ZERO = SqlLiteral.double(1);\nSqlLiteral.EMPTY_STRING = SqlLiteral.create('');\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\n\nexport interface SqlIntervalValue extends SqlBaseValue {\n  intervalValue?: SqlLiteral;\n  unit?: string;\n}\n\nexport class SqlInterval extends SqlExpression {\n  static type: SqlTypeDesignator = 'interval';\n\n  static DEFAULT_INTERVAL_KEYWORD = 'INTERVAL';\n\n  static create(unit: string, intervalValue: number) {\n    return new SqlInterval({\n      intervalValue: SqlLiteral.create(String(intervalValue)),\n      unit,\n    });\n  }\n\n  public readonly intervalValue?: SqlLiteral;\n  public readonly unit?: string;\n\n  constructor(options: SqlIntervalValue) {\n    super(options, SqlInterval.type);\n    this.intervalValue = options.intervalValue;\n    this.unit = options.unit;\n  }\n\n  public valueOf(): SqlIntervalValue {\n    const value = super.valueOf() as SqlIntervalValue;\n    value.intervalValue = this.intervalValue;\n    value.unit = this.unit;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('interval', SqlInterval.DEFAULT_INTERVAL_KEYWORD),\n      this.getSpace('postInterval'),\n      this.intervalValue,\n      this.getSpace('postIntervalValue'),\n      this.unit,\n    ].join('');\n  }\n}\n\nSqlBase.register(SqlInterval);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const SPECIAL_FUNCTIONS = [\n  'CURRENT_CATALOG',\n  'CURRENT_DATE',\n  'CURRENT_DEFAULT_TRANSFORM_GROUP',\n  'CURRENT_PATH',\n  'CURRENT_ROLE',\n  'CURRENT_ROW',\n  'CURRENT_SCHEMA',\n  'CURRENT_TIME',\n  'CURRENT_TIMESTAMP',\n  'CURRENT_TRANSFORM_GROUP_FOR_TYPE',\n  'CURRENT_USER',\n  'PI',\n];\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\n\nexport interface SqlClauseValue extends SqlBaseValue {}\n\nexport abstract class SqlClause extends SqlBase {\n  public _walkHelper(stack: SqlBase[], fn: Substitutor, postorder: boolean): SqlClause | undefined {\n    const ret = super._walkHelper(stack, fn, postorder);\n    if (!ret) return;\n    if (ret === this) return this;\n    if (ret instanceof SqlClause) {\n      return ret;\n    } else {\n      throw new Error('must return a sql clause');\n    }\n  }\n\n  public _walkInner(\n    _nextStack: SqlBase[],\n    _fn: Substitutor,\n    _postorder: boolean,\n  ): SqlClause | undefined {\n    return this;\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlExpression } from '../../sql-expression';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\n\nexport type SqlOrderByDirection = 'ASC' | 'DESC';\n\nexport interface SqlOrderByExpressionValue extends SqlBaseValue {\n  expression: SqlExpression;\n  direction?: SqlOrderByDirection;\n}\n\nexport class SqlOrderByExpression extends SqlBase {\n  static type: SqlTypeDesignator = 'orderByExpression';\n\n  static create(expression: SqlExpression, direction?: SqlOrderByDirection) {\n    return new SqlOrderByExpression({\n      expression: SqlExpression.verify(expression),\n      direction,\n    });\n  }\n\n  static index(value: number, direction?: SqlOrderByDirection) {\n    return new SqlOrderByExpression({\n      expression: SqlLiteral.index(value),\n      direction,\n    });\n  }\n\n  public readonly expression: SqlExpression;\n  public readonly direction?: SqlOrderByDirection;\n\n  constructor(options: SqlOrderByExpressionValue) {\n    super(options, SqlOrderByExpression.type);\n    this.expression = options.expression;\n\n    const direction = options.direction;\n    this.direction = direction;\n    if (direction) {\n      if (direction !== 'ASC' && direction !== 'DESC') {\n        throw new Error(`invalid direction ${direction}`);\n      }\n    }\n  }\n\n  public valueOf(): SqlOrderByExpressionValue {\n    const value = super.valueOf() as SqlOrderByExpressionValue;\n    value.expression = this.expression;\n    value.direction = this.direction;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts = [this.expression.toString()];\n\n    if (this.direction) {\n      rawParts.push(this.getSpace('preDirection'), this.getKeyword('direction', this.direction));\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeExpression(expression: SqlExpression): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeDirection(direction: SqlOrderByDirection | undefined): this {\n    const value = this.valueOf();\n    if (direction) {\n      value.direction = direction;\n    } else {\n      delete value.direction;\n      value.spacing = this.getSpacingWithout('preDirection');\n    }\n    value.keywords = this.getKeywordsWithout('direction');\n    return SqlBase.fromValue(value);\n  }\n\n  public getEffectiveDirection(): SqlOrderByDirection {\n    const { direction } = this;\n    if (!direction) return 'ASC';\n    return direction;\n  }\n\n  public reverseDirection(): this {\n    return this.changeDirection(this.getEffectiveDirection() === 'ASC' ? 'DESC' : 'ASC');\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const expression = this.expression._walkHelper(nextStack, fn, postorder);\n    if (!expression) return;\n    if (expression !== this.expression) {\n      ret = ret.changeExpression(expression);\n    }\n\n    return ret;\n  }\n\n  public isIndex(): boolean {\n    const { expression } = this;\n    return expression instanceof SqlLiteral && expression.isIndex();\n  }\n\n  public getIndexValue(): number {\n    const { expression } = this;\n    return expression instanceof SqlLiteral ? expression.getIndexValue() : -1;\n  }\n\n  public incrementIndex(amount = 1): SqlOrderByExpression {\n    const { expression } = this;\n    if (expression instanceof SqlLiteral) {\n      return this.changeExpression(expression.incrementIndex(amount));\n    } else {\n      return this;\n    }\n  }\n}\n\nSqlBase.register(SqlOrderByExpression);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\nimport { SqlOrderByExpression } from '../sql-order-by-expression/sql-order-by-expression';\n\nexport interface SqlOrderByClauseValue extends SqlClauseValue {\n  expressions: SeparatedArray<SqlOrderByExpression>;\n}\n\nexport class SqlOrderByClause extends SqlClause {\n  static type: SqlTypeDesignator = 'orderByClause';\n\n  static DEFAULT_ORDER_BY_KEYWORD = 'ORDER BY';\n\n  static create(\n    expressions:\n      | SeparatedArray<SqlOrderByExpression>\n      | SqlOrderByExpression[]\n      | SqlOrderByExpression,\n  ): SqlOrderByClause {\n    if (expressions instanceof SqlOrderByExpression) {\n      return new SqlOrderByClause({\n        expressions: SeparatedArray.fromSingleValue(expressions),\n      });\n    } else {\n      return new SqlOrderByClause({\n        expressions: SeparatedArray.fromArray(expressions),\n      });\n    }\n  }\n\n  public readonly expressions: SeparatedArray<SqlOrderByExpression>;\n\n  constructor(options: SqlOrderByClauseValue) {\n    super(options, SqlOrderByClause.type);\n    this.expressions = options.expressions;\n  }\n\n  public valueOf(): SqlOrderByClauseValue {\n    const value = super.valueOf() as SqlOrderByClauseValue;\n    value.expressions = this.expressions;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('orderBy', SqlOrderByClause.DEFAULT_ORDER_BY_KEYWORD),\n      this.getSpace('postOrderBy'),\n      this.expressions.toString(),\n    ].join('');\n  }\n\n  public changeExpressions(\n    expressions: SeparatedArray<SqlOrderByExpression> | SqlOrderByExpression[],\n  ): this {\n    const value = this.valueOf();\n    value.expressions = SeparatedArray.fromArray(expressions);\n    return SqlBase.fromValue(value);\n  }\n\n  public addExpression(\n    expression: SqlOrderByExpression,\n    where: 'start' | 'end' = 'end',\n  ): SqlOrderByClause {\n    const { expressions } = this;\n    return this.changeExpressions(expressions.insert(where === 'start' ? 0 : Infinity, expression));\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n    if (!expressions) return;\n    if (expressions !== this.expressions) {\n      ret = ret.changeExpressions(expressions);\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.expressions = this.expressions.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  public toArray(): readonly SqlOrderByExpression[] {\n    return this.expressions.values;\n  }\n\n  public addFirst(orderBy: SqlOrderByExpression): SqlOrderByClause {\n    return this.changeExpressions(this.expressions.prepend(orderBy));\n  }\n\n  public removeExpression(\n    selectExpression: SqlExpression,\n    selectIndex: number,\n  ): SqlOrderByClause | undefined {\n    if (!this.expressions) return this;\n    const newExpression = this.expressions.filterMap(orderByExpression => {\n      const { expression } = orderByExpression;\n      if (expression instanceof SqlLiteral && expression.isIndex()) {\n        const expressionIndex = expression.getIndexValue();\n        if (expressionIndex > selectIndex) {\n          orderByExpression = orderByExpression.changeExpression(expression.incrementIndex(-1));\n        } else if (expressionIndex === selectIndex) {\n          return;\n        }\n      }\n      if (expression.equals(selectExpression.getUnderlyingExpression())) return;\n      return orderByExpression;\n    });\n\n    if (!newExpression) return;\n    return this.changeExpressions(newExpression);\n  }\n\n  public shiftIndexes(aboveIndex: number): SqlOrderByClause {\n    if (!this.expressions) return this;\n    return this.changeExpressions(\n      this.expressions.map(orderExpression => {\n        if (orderExpression.isIndex()) {\n          const orderExpressionIndex = orderExpression.getIndexValue();\n          if (aboveIndex <= orderExpressionIndex) {\n            return orderExpression.incrementIndex();\n          }\n        }\n        return orderExpression;\n      }),\n    );\n  }\n}\n\nSqlBase.register(SqlOrderByClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlColumnList } from '../../sql-column-list/sql-column-list';\nimport { SqlExpression } from '../../sql-expression';\n\nexport type SqlJoinJoinTypeWithOn = 'LEFT' | 'RIGHT' | 'FULL' | 'INNER';\n\nexport type SqlJoinJoinType = SqlJoinJoinTypeWithOn | 'CROSS';\n\nexport interface SqlJoinPartValue extends SqlBaseValue {\n  natural?: boolean;\n  joinType?: SqlJoinJoinType;\n  table: SqlExpression;\n  onExpression?: SqlExpression;\n  usingColumns?: SqlColumnList;\n}\n\nexport class SqlJoinPart extends SqlBase {\n  static type: SqlTypeDesignator = 'joinPart';\n\n  static DEFAULT_NATURAL_KEYWORD = 'NATURAL';\n  static DEFAULT_JOIN_KEYWORD = 'JOIN';\n  static DEFAULT_ON_KEYWORD = 'ON';\n  static DEFAULT_USING_KEYWORD = 'USING';\n\n  static create(\n    joinType: SqlJoinJoinTypeWithOn,\n    table: SqlExpression,\n    onExpression?: SqlExpression | SqlExpression[],\n    usingColumns?: SqlColumnList,\n  ): SqlJoinPart {\n    if (Array.isArray(onExpression)) {\n      onExpression = SqlExpression.and(...onExpression);\n    }\n\n    return new SqlJoinPart({\n      joinType: joinType,\n      table: table.convertToTable(),\n      onExpression: onExpression,\n      usingColumns: usingColumns,\n    });\n  }\n\n  static natural(joinType: SqlJoinJoinTypeWithOn, table: SqlExpression): SqlJoinPart {\n    return new SqlJoinPart({\n      natural: true,\n      joinType: joinType,\n      table: table.convertToTable(),\n    });\n  }\n\n  static cross(table: SqlExpression): SqlJoinPart {\n    return new SqlJoinPart({\n      joinType: 'CROSS',\n      table: table.convertToTable(),\n    });\n  }\n\n  public readonly natural?: boolean;\n  public readonly joinType?: SqlJoinJoinType;\n  public readonly table: SqlExpression;\n  public readonly onExpression?: SqlExpression;\n  public readonly usingColumns?: SqlColumnList;\n\n  constructor(options: SqlJoinPartValue) {\n    super(options, SqlJoinPart.type);\n    this.natural = options.natural;\n    this.joinType = options.joinType;\n    this.table = options.table;\n    this.onExpression = options.onExpression;\n    this.usingColumns = options.usingColumns;\n  }\n\n  public valueOf(): SqlJoinPartValue {\n    const value = super.valueOf() as SqlJoinPartValue;\n    value.natural = this.natural;\n    value.joinType = this.joinType;\n    value.table = this.table;\n    value.onExpression = this.onExpression;\n    value.usingColumns = this.usingColumns;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [];\n\n    if (this.natural) {\n      rawParts.push(\n        this.getKeyword('natural', SqlJoinPart.DEFAULT_NATURAL_KEYWORD),\n        this.getSpace('postNatural'),\n      );\n    }\n\n    if (this.joinType) {\n      rawParts.push(this.getKeyword('joinType', this.joinType), this.getSpace('postJoinType'));\n    }\n\n    rawParts.push(\n      this.getKeyword('join', SqlJoinPart.DEFAULT_JOIN_KEYWORD),\n      this.getSpace('postJoin'),\n      this.table.toString(),\n    );\n\n    if (this.onExpression) {\n      rawParts.push(\n        this.getSpace('preOn'),\n        this.getKeyword('on', SqlJoinPart.DEFAULT_ON_KEYWORD),\n        this.getSpace('postOn'),\n        this.onExpression.toString(),\n      );\n    }\n\n    if (this.usingColumns) {\n      rawParts.push(\n        this.getSpace('preUsing'),\n        this.getKeyword('using', SqlJoinPart.DEFAULT_USING_KEYWORD),\n        this.getSpace('postUsing'),\n        this.usingColumns.toString(),\n      );\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeJoinTable(table: SqlExpression): this {\n    const value = this.valueOf();\n    value.table = table;\n    return SqlBase.fromValue(value);\n  }\n\n  public makeNatural(): this {\n    const value = this.valueOf();\n\n    if (value.onExpression || value.usingColumns) {\n      value.keywords = this.getKeywordsWithout('using', 'on');\n      value.spacing = this.getSpacingWithout('preUsing', 'postUsing', 'preOn', 'postOn');\n      delete value.usingColumns;\n      delete value.onExpression;\n    }\n\n    value.natural = true;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOnExpression(onExpression: SqlExpression): this {\n    const value = this.valueOf();\n\n    if (value.natural || value.usingColumns) {\n      value.keywords = this.getKeywordsWithout('natural', 'using');\n      value.spacing = this.getSpacingWithout('postNatural', 'preUsing', 'postUsing');\n      delete value.natural;\n      delete value.usingColumns;\n    }\n\n    value.onExpression = onExpression;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeUsingColumns(usingColumns: SqlColumnList): this {\n    const value = this.valueOf();\n\n    if (value.natural || value.onExpression) {\n      value.keywords = this.getKeywordsWithout('natural', 'on');\n      value.spacing = this.getSpacingWithout('postNatural', 'preOn', 'postOn');\n      delete value.onExpression;\n    }\n\n    value.usingColumns = usingColumns;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const table = this.table._walkHelper(nextStack, fn, postorder);\n    if (!table) return;\n    if (table !== this.table) {\n      ret = ret.changeJoinTable(table);\n    }\n\n    if (this.onExpression) {\n      const onExpression = this.onExpression._walkHelper(nextStack, fn, postorder);\n      if (!onExpression) return;\n      if (onExpression !== this.onExpression) {\n        ret = ret.changeOnExpression(onExpression);\n      }\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlJoinPart);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlTable } from '../sql-table/sql-table';\n\nexport interface SqlStarValue extends SqlBaseValue {\n  table?: SqlTable;\n}\n\nexport class SqlStar extends SqlExpression {\n  static type: SqlTypeDesignator = 'star';\n\n  static PLAIN: SqlStar;\n\n  static create(table?: SqlTable) {\n    return new SqlStar({\n      table,\n    });\n  }\n\n  public readonly table?: SqlTable;\n\n  constructor(options: SqlStarValue = {}) {\n    super(options, SqlStar.type);\n    this.table = options.table;\n  }\n\n  public valueOf(): SqlStarValue {\n    const value = super.valueOf() as SqlStarValue;\n    value.table = this.table;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { table } = this;\n    const rawParts: string[] = [];\n\n    if (table) {\n      rawParts.push(\n        table.toString(),\n        this.getSpace('postTable', ''),\n        '.',\n        this.getSpace('postDot', ''),\n      );\n    }\n\n    rawParts.push('*');\n\n    return rawParts.join('');\n  }\n\n  public changeTable(table: SqlTable | undefined): this {\n    const value = this.valueOf();\n    if (table) {\n      value.table = table;\n    } else {\n      delete value.table;\n      value.spacing = this.getSpacingWithout('postTable', 'postDot');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getTableName(): string | undefined {\n    return this.table?.getName();\n  }\n\n  public changeTableName(table: string | undefined): this {\n    return this.changeTable(\n      table ? (this.table ? this.table.changeName(table) : SqlTable.create(table)) : undefined,\n    );\n  }\n\n  public prettyTrim(maxLength: number): this {\n    const { table } = this;\n    if (!table) return this;\n    return this.changeTable(table.prettyTrim(maxLength));\n  }\n}\n\nSqlBase.register(SqlStar);\n\nSqlStar.PLAIN = SqlStar.create();\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlColumn } from '../sql-column/sql-column';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlNamespace } from '../sql-namespace/sql-namespace';\nimport { SqlStar } from '../sql-star/sql-star';\n\nexport interface SqlTableValue extends SqlBaseValue {\n  refName: RefName;\n  namespace?: SqlNamespace;\n}\n\nexport class SqlTable extends SqlExpression {\n  static type: SqlTypeDesignator = 'table';\n\n  static create(name: string | SqlTable, namespace?: SqlNamespace | string) {\n    if (name instanceof SqlTable) {\n      return namespace ? name.changeNamespace(SqlNamespace.create(namespace)) : name;\n    }\n    return new SqlTable({\n      refName: RefName.create(name),\n      namespace: namespace ? SqlNamespace.create(namespace) : undefined,\n    });\n  }\n\n  static optionalQuotes(name: string | SqlTable, namespace?: SqlNamespace | string) {\n    if (name instanceof SqlTable) {\n      return namespace ? name.changeNamespace(SqlNamespace.create(namespace)) : name;\n    }\n    return new SqlTable({\n      refName: RefName.create(name, false),\n      namespace: namespace ? SqlNamespace.optionalQuotes(namespace) : undefined,\n    });\n  }\n\n  public readonly refName: RefName;\n  public readonly namespace?: SqlNamespace;\n\n  constructor(options: SqlTableValue) {\n    super(options, SqlTable.type);\n    this.refName = options.refName;\n    this.namespace = options.namespace;\n  }\n\n  public valueOf(): SqlTableValue {\n    const value = super.valueOf() as SqlTableValue;\n    value.refName = this.refName;\n    value.namespace = this.namespace;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { namespace, refName } = this;\n    const rawParts: string[] = [];\n\n    if (namespace) {\n      rawParts.push(\n        namespace.toString(),\n        this.getSpace('postNamespace', ''),\n        '.',\n        this.getSpace('postDot', ''),\n      );\n    }\n\n    rawParts.push(refName.toString());\n\n    return rawParts.join('');\n  }\n\n  public changeRefName(refName: RefName): this {\n    const value = this.valueOf();\n    value.refName = refName;\n    return SqlBase.fromValue(value);\n  }\n\n  public getName(): string {\n    return this.refName.name;\n  }\n\n  public changeName(name: string): this {\n    const { refName } = this;\n    const value = this.valueOf();\n    value.refName = refName.changeName(name);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeNamespace(namespace: SqlNamespace | undefined): this {\n    const value = this.valueOf();\n    if (namespace) {\n      value.namespace = namespace;\n    } else {\n      delete value.namespace;\n      value.spacing = this.getSpacingWithout('postNamespace', 'postDot');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getNamespaceName(): string | undefined {\n    return this.namespace?.getName();\n  }\n\n  public changeNamespaceName(namespace: string | undefined): this {\n    return this.changeNamespace(\n      namespace\n        ? this.namespace\n          ? this.namespace.changeName(namespace)\n          : SqlNamespace.create(namespace)\n        : undefined,\n    );\n  }\n\n  public prettyTrim(maxLength: number): this {\n    const { refName, namespace } = this;\n    let ret = this.changeRefName(refName.prettyTrim(maxLength));\n    if (namespace) {\n      ret = ret.changeNamespace(namespace.prettyTrim(maxLength));\n    }\n    return ret;\n  }\n\n  public convertToNamespace(): SqlNamespace {\n    if (this.namespace) {\n      throw new Error('can not convert');\n    }\n    return new SqlNamespace({\n      refName: this.refName,\n    });\n  }\n\n  public column(name: string): SqlColumn {\n    return SqlColumn.create(name, this);\n  }\n\n  public columnWithOptionalQuotes(name: string): SqlColumn {\n    return SqlColumn.optionalQuotes(name, this);\n  }\n\n  public star(): SqlStar {\n    return SqlStar.create(this);\n  }\n}\n\nSqlBase.register(SqlTable);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlTable } from '../sql-table/sql-table';\n\nexport interface SqlColumnValue extends SqlBaseValue {\n  refName: RefName;\n  table?: SqlTable;\n}\n\nexport class SqlColumn extends SqlExpression {\n  static type: SqlTypeDesignator = 'column';\n\n  static create(name: string | SqlColumn, table?: SqlTable | string) {\n    if (name instanceof SqlColumn) {\n      return table ? name.changeTable(SqlTable.create(table)) : name;\n    }\n    return new SqlColumn({\n      refName: RefName.create(name),\n      table: table ? SqlTable.create(table) : undefined,\n    });\n  }\n\n  static optionalQuotes(name: string | SqlColumn, table?: SqlTable | string) {\n    if (name instanceof SqlColumn) {\n      return table ? name.changeTable(SqlTable.create(table)) : name;\n    }\n    return new SqlColumn({\n      refName: RefName.create(name, false),\n      table: table ? SqlTable.optionalQuotes(table) : undefined,\n    });\n  }\n\n  public readonly refName: RefName;\n  public readonly table?: SqlTable;\n\n  constructor(options: SqlColumnValue) {\n    super(options, SqlColumn.type);\n    this.refName = options.refName;\n    this.table = options.table;\n  }\n\n  public valueOf(): SqlColumnValue {\n    const value = super.valueOf() as SqlColumnValue;\n    value.refName = this.refName;\n    value.table = this.table;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { table, refName } = this;\n    const rawParts: string[] = [];\n\n    if (table) {\n      rawParts.push(\n        table.toString(),\n        this.getSpace('postTable', ''),\n        '.',\n        this.getSpace('postDot', ''),\n      );\n    }\n\n    rawParts.push(refName.toString());\n\n    return rawParts.join('');\n  }\n\n  public changeRefName(refName: RefName): this {\n    const value = this.valueOf();\n    value.refName = refName;\n    return SqlBase.fromValue(value);\n  }\n\n  public getName(): string {\n    return this.refName.name;\n  }\n\n  public changeName(name: string): this {\n    const { refName } = this;\n    const value = this.valueOf();\n    value.refName = refName.changeName(name);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeTable(table: SqlTable | undefined): this {\n    const value = this.valueOf();\n    if (table) {\n      value.table = table;\n    } else {\n      delete value.table;\n      value.spacing = this.getSpacingWithout('postTable', 'postDot');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getTableName(): string | undefined {\n    return this.table?.getName();\n  }\n\n  public changeTableName(table: string | undefined): this {\n    return this.changeTable(\n      table ? (this.table ? this.table.changeName(table) : SqlTable.create(table)) : undefined,\n    );\n  }\n\n  public getNamespaceName(): string | undefined {\n    return this.table?.getNamespaceName();\n  }\n\n  public prettyTrim(maxLength: number): this {\n    const { refName, table } = this;\n    let ret = this.changeRefName(refName.prettyTrim(maxLength));\n    if (table) {\n      ret = ret.changeTable(table.prettyTrim(maxLength));\n    }\n    return ret;\n  }\n\n  public convertToTable(): SqlTable {\n    const { refName, table, spacing } = this;\n    return new SqlTable({\n      refName,\n      namespace: table?.convertToNamespace(),\n      spacing: {\n        postNamespace: spacing['postTable'],\n        postDot: spacing['postDot'],\n      },\n    });\n  }\n\n  public getOutputName(): string {\n    return this.getName();\n  }\n}\n\nSqlBase.register(SqlColumn);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { filterMap } from '../../utils';\nimport type { SeparatedArray } from '../helpers';\nimport { NEWLINE, RefName } from '../helpers';\nimport { parse as parseSql } from '../parser';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\n\nexport interface SqlSetStatementValue extends SqlBaseValue {\n  key: RefName;\n  value: SqlLiteral;\n}\n\nexport class SqlSetStatement extends SqlBase {\n  static type: SqlTypeDesignator = 'setStatement';\n\n  static DEFAULT_SET_KEYWORD = 'SET';\n\n  static create(key: string | RefName, value: LiteralValue | SqlLiteral): SqlSetStatement {\n    return new SqlSetStatement({\n      key: RefName.create(key, false),\n      value: SqlLiteral.create(value),\n    });\n  }\n\n  static parseStatementsOnly(text: string): {\n    spaceBefore: string;\n    contextStatements?: SeparatedArray<SqlSetStatement>;\n    spaceAfter?: string;\n    rest: string;\n  } {\n    return parseSql(text, {\n      startRule: 'StartSetStatementsOnly',\n    });\n  }\n\n  static partitionSetStatements(text: string, putSpaceWithSets = false): [string, string] {\n    const { spaceBefore, contextStatements, spaceAfter, rest } =\n      SqlSetStatement.parseStatementsOnly(text);\n\n    if (contextStatements) {\n      return [\n        spaceBefore + contextStatements.toString(NEWLINE) + (putSpaceWithSets ? spaceAfter : ''),\n        (putSpaceWithSets ? '' : spaceAfter) + rest,\n      ];\n    } else if (putSpaceWithSets) {\n      return [spaceBefore, rest];\n    } else {\n      return ['', text];\n    }\n  }\n\n  static getContextFromText(text: string): Record<string, any> {\n    const { contextStatements } = SqlSetStatement.parseStatementsOnly(text);\n    if (!contextStatements) return {};\n    return SqlSetStatement.contextStatementsToContext(contextStatements.values);\n  }\n\n  static setContextInText(text: string, context: Record<string, any>): string {\n    const { spaceBefore, spaceAfter, rest } = SqlSetStatement.parseStatementsOnly(text);\n\n    const contextStatements = SqlSetStatement.contextToContextStatements(context);\n    return [\n      spaceBefore,\n      contextStatements.join(NEWLINE),\n      contextStatements.length ? spaceAfter ?? NEWLINE : '',\n      rest,\n    ].join('');\n  }\n\n  static contextStatementsToContext(\n    contextStatements: readonly SqlSetStatement[] | undefined,\n  ): Record<string, any> {\n    const context: Record<string, any> = {};\n    if (contextStatements) {\n      for (const contextStatement of contextStatements) {\n        context[contextStatement.getKeyString()] = contextStatement.value.value;\n      }\n    }\n    return context;\n  }\n\n  static contextToContextStatements(context: Record<string, any>): SqlSetStatement[] {\n    return filterMap(Object.entries(context), ([k, v]) =>\n      typeof v !== 'undefined' ? SqlSetStatement.create(k, v) : undefined,\n    );\n  }\n\n  public readonly key: RefName;\n  public readonly value: SqlLiteral;\n\n  constructor(options: SqlSetStatementValue) {\n    super(options, SqlSetStatement.type);\n    this.key = options.key;\n    this.value = options.value;\n  }\n\n  public valueOf(): SqlSetStatementValue {\n    const value = super.valueOf() as SqlSetStatementValue;\n    value.key = this.key;\n    value.value = this.value;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('set', SqlSetStatement.DEFAULT_SET_KEYWORD),\n      this.getSpace('postSet'),\n      this.key.toString(),\n      this.getSpace('postKey'),\n      '=',\n      this.getSpace('postEquals'),\n      this.value.toString(),\n      this.getSpace('postValue', ''),\n      ';',\n    ].join('');\n  }\n\n  public getKeyString(): string {\n    return this.key.name;\n  }\n\n  public changeKey(key: RefName | string): this {\n    const value = this.valueOf();\n    value.key = RefName.create(key, false);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeValue(value: SqlLiteral | LiteralValue): this {\n    const v = this.valueOf();\n    v.value = SqlLiteral.create(value);\n    return SqlBase.fromValue(v);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const value = this.value._walkHelper(nextStack, fn, postorder);\n    if (!value) return;\n    if (value !== this.value) {\n      ret = ret.changeValue(value as SqlLiteral);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlSetStatement);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEmptyArray } from '../../utils';\nimport { NEWLINE, SeparatedArray } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlOrderByExpression, SqlPartitionedByClause } from '../sql-clause';\nimport {\n  SqlClusteredByClause,\n  SqlInsertClause,\n  SqlLimitClause,\n  SqlOffsetClause,\n  SqlOrderByClause,\n  SqlReplaceClause,\n  SqlWithClause,\n  SqlWithPart,\n} from '../sql-clause';\nimport { SqlExpression } from '../sql-expression';\nimport type { SqlLiteral } from '../sql-literal/sql-literal';\nimport { SqlQuery } from '../sql-query/sql-query';\nimport { SqlSetStatement } from '../sql-set-statement/sql-set-statement';\n\nexport interface SqlWithQueryValue extends SqlBaseValue {\n  contextStatements?: SeparatedArray<SqlSetStatement>;\n  explain?: boolean;\n  insertClause?: SqlInsertClause;\n  replaceClause?: SqlReplaceClause;\n  withClause: SqlWithClause;\n\n  query: SqlQuery | SqlWithQuery;\n\n  orderByClause?: SqlOrderByClause;\n  limitClause?: SqlLimitClause;\n  offsetClause?: SqlOffsetClause;\n  partitionedByClause?: SqlPartitionedByClause;\n  clusteredByClause?: SqlClusteredByClause;\n}\n\nexport class SqlWithQuery extends SqlExpression {\n  static type: SqlTypeDesignator = 'withQuery';\n\n  public readonly contextStatements?: SeparatedArray<SqlSetStatement>;\n  public readonly explain?: boolean;\n  public readonly insertClause?: SqlInsertClause;\n  public readonly replaceClause?: SqlReplaceClause;\n  public readonly withClause: SqlWithClause;\n  public readonly query: SqlQuery | SqlWithQuery;\n  public readonly orderByClause?: SqlOrderByClause;\n  public readonly limitClause?: SqlLimitClause;\n  public readonly offsetClause?: SqlOffsetClause;\n  public readonly partitionedByClause?: SqlPartitionedByClause;\n  public readonly clusteredByClause?: SqlClusteredByClause;\n\n  constructor(options: SqlWithQueryValue) {\n    super(options, SqlWithQuery.type);\n    this.contextStatements = options.contextStatements;\n    this.explain = options.explain;\n    this.insertClause = options.insertClause;\n    this.replaceClause = options.replaceClause;\n    if (this.insertClause && this.replaceClause) {\n      throw new Error('SqlWithQuery can not have both an insertClause and a replaceClause');\n    }\n\n    this.withClause = options.withClause;\n    this.query = options.query;\n    this.orderByClause = options.orderByClause;\n    this.limitClause = options.limitClause;\n    this.offsetClause = options.offsetClause;\n    this.partitionedByClause = options.partitionedByClause;\n    this.clusteredByClause = options.clusteredByClause;\n  }\n\n  public valueOf(): SqlWithQueryValue {\n    const value = super.valueOf() as SqlWithQueryValue;\n    value.contextStatements = this.contextStatements;\n    value.explain = this.explain;\n    value.insertClause = this.insertClause;\n    value.replaceClause = this.replaceClause;\n    value.withClause = this.withClause;\n    value.query = this.query;\n    value.orderByClause = this.orderByClause;\n    value.limitClause = this.limitClause;\n    value.offsetClause = this.offsetClause;\n    value.partitionedByClause = this.partitionedByClause;\n    value.clusteredByClause = this.clusteredByClause;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const {\n      contextStatements,\n      explain,\n      insertClause,\n      replaceClause,\n      withClause,\n      query,\n      orderByClause,\n      limitClause,\n      offsetClause,\n      partitionedByClause,\n      clusteredByClause,\n    } = this;\n\n    const rawParts: string[] = [];\n\n    // SET clauses\n    if (contextStatements) {\n      rawParts.push(contextStatements.toString(NEWLINE), this.getSpace('postSets', NEWLINE));\n    }\n\n    // Explain\n    if (explain) {\n      rawParts.push(\n        this.getKeyword('explainPlanFor', SqlQuery.DEFAULT_EXPLAIN_PLAN_FOR_KEYWORD),\n        this.getSpace('postExplainPlanFor', NEWLINE),\n      );\n    }\n\n    // INSERT / REPLACE clause\n    if (insertClause) {\n      rawParts.push(insertClause.toString(), this.getSpace('postInsertClause', NEWLINE));\n    } else if (replaceClause) {\n      rawParts.push(replaceClause.toString(), this.getSpace('postReplaceClause', NEWLINE));\n    }\n\n    // WITH clause\n    rawParts.push(withClause.toString(), this.getSpace('postWithClause', NEWLINE));\n\n    // Sub query\n    rawParts.push(query.toString());\n\n    if (orderByClause) {\n      rawParts.push(this.getSpace('preOrderByClause', NEWLINE), orderByClause.toString());\n    }\n\n    if (limitClause) {\n      rawParts.push(this.getSpace('preLimitClause', NEWLINE), limitClause.toString());\n    }\n\n    if (offsetClause) {\n      rawParts.push(this.getSpace('preOffsetClause', NEWLINE), offsetClause.toString());\n    }\n\n    if (partitionedByClause) {\n      rawParts.push(\n        this.getSpace('prePartitionedByClause', NEWLINE),\n        partitionedByClause.toString(),\n      );\n    }\n\n    if (clusteredByClause) {\n      rawParts.push(this.getSpace('preClusteredByClause', NEWLINE), clusteredByClause.toString());\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeContextStatements(\n    contextStatements: SeparatedArray<SqlSetStatement> | SqlSetStatement[] | undefined,\n  ): this {\n    const newContextStatements = SeparatedArray.fromPossiblyEmptyArray(contextStatements);\n    const value = this.valueOf();\n    if (newContextStatements) {\n      value.contextStatements = newContextStatements;\n    } else {\n      delete value.contextStatements;\n      value.spacing = this.getSpacingWithout('postSets');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public hasContext(): boolean {\n    return Boolean(this.contextStatements);\n  }\n\n  public getContext(): Record<string, any> {\n    return SqlSetStatement.contextStatementsToContext(this.contextStatements?.values);\n  }\n\n  public changeContext(context: Record<string, any>): this {\n    return this.changeContextStatements(\n      context ? SqlSetStatement.contextToContextStatements(context) : undefined,\n    );\n  }\n\n  public changeExplain(explain: boolean): this {\n    if (this.explain === explain) return this;\n    const value = this.valueOf();\n    if (explain) {\n      value.explain = true;\n    } else {\n      delete value.explain;\n      value.spacing = this.getSpacingWithout('postExplainPlanFor');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeInsertClause(insertClause: SqlInsertClause | undefined): this {\n    if (this.insertClause === insertClause) return this;\n    const value = this.valueOf();\n    if (insertClause) {\n      value.insertClause = insertClause;\n    } else {\n      delete value.insertClause;\n      value.spacing = this.getSpacingWithout('postInsertClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeReplaceClause(replaceClause: SqlReplaceClause | undefined): this {\n    if (this.replaceClause === replaceClause) return this;\n    const value = this.valueOf();\n    if (replaceClause) {\n      value.replaceClause = replaceClause;\n    } else {\n      delete value.replaceClause;\n      value.spacing = this.getSpacingWithout('postReplaceClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWithClause(withClause: SqlWithClause): this {\n    if (this.withClause === withClause) return this;\n    const value = this.valueOf();\n    value.withClause = withClause;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeQuery(query: SqlQuery): this {\n    if (this.query === query) return this;\n    const value = this.valueOf();\n    value.query = query;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByClause(orderByClause: SqlOrderByClause | undefined): this {\n    if (this.orderByClause === orderByClause) return this;\n    const value = this.valueOf();\n    if (orderByClause) {\n      value.orderByClause = orderByClause;\n    } else {\n      delete value.orderByClause;\n      value.spacing = this.getSpacingWithout('preOrderByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByExpressions(\n    orderByExpressions: SeparatedArray<SqlOrderByExpression> | SqlOrderByExpression[] | undefined,\n  ): this {\n    if (!orderByExpressions) return this.changeOrderByClause(undefined);\n    return this.changeOrderByClause(\n      this.orderByClause\n        ? this.orderByClause.changeExpressions(orderByExpressions)\n        : SqlOrderByClause.create(orderByExpressions),\n    );\n  }\n\n  public changeOrderByExpression(orderByExpression: SqlOrderByExpression | undefined): this {\n    if (!orderByExpression) return this.changeOrderByClause(undefined);\n    return this.changeOrderByExpressions([orderByExpression]);\n  }\n\n  public changeLimitClause(limitClause: SqlLimitClause | undefined): this {\n    if (this.limitClause === limitClause) return this;\n    const value = this.valueOf();\n    if (limitClause) {\n      value.limitClause = limitClause;\n    } else {\n      delete value.limitClause;\n      value.spacing = this.getSpacingWithout('preLimitClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getLimitValue(): number | undefined {\n    return this.limitClause?.getLimitValue();\n  }\n\n  public changeLimitValue(limitValue: SqlLiteral | number | undefined): this {\n    if (typeof limitValue === 'number' && limitValue < 0) {\n      throw new Error(`${limitValue} is not a valid limit value`);\n    }\n    if (typeof limitValue === 'undefined') return this.changeLimitClause(undefined);\n    if (typeof limitValue === 'number' && !isFinite(limitValue)) {\n      return this.changeLimitClause(undefined);\n    }\n    return this.changeLimitClause(\n      this.limitClause\n        ? this.limitClause.changeLimit(limitValue)\n        : SqlLimitClause.create(limitValue),\n    );\n  }\n\n  public changeOffsetClause(offsetClause: SqlOffsetClause | undefined): this {\n    if (this.offsetClause === offsetClause) return this;\n    const value = this.valueOf();\n    if (offsetClause) {\n      value.offsetClause = offsetClause;\n    } else {\n      delete value.offsetClause;\n      value.spacing = this.getSpacingWithout('preOffsetClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getOffsetValue(): number | undefined {\n    return this.offsetClause?.getOffsetValue();\n  }\n\n  public changeOffsetValue(offsetValue: SqlLiteral | number | undefined): this {\n    if (typeof offsetValue === 'undefined') return this.changeOffsetClause(undefined);\n    return this.changeOffsetClause(\n      this.offsetClause\n        ? this.offsetClause.changeOffset(offsetValue)\n        : SqlOffsetClause.create(offsetValue),\n    );\n  }\n\n  public changePartitionedByClause(partitionedByClause: SqlPartitionedByClause | undefined): this {\n    if (this.partitionedByClause === partitionedByClause) return this;\n    const value = this.valueOf();\n    if (partitionedByClause) {\n      value.partitionedByClause = partitionedByClause;\n    } else {\n      delete value.partitionedByClause;\n      value.spacing = this.getSpacingWithout('prePartitionedByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeClusteredByClause(clusteredByClause: SqlClusteredByClause | undefined): this {\n    if (this.clusteredByClause === clusteredByClause) return this;\n    const value = this.valueOf();\n    if (clusteredByClause) {\n      value.clusteredByClause = clusteredByClause;\n    } else {\n      delete value.clusteredByClause;\n      value.spacing = this.getSpacingWithout('preClusteredByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeClusteredByExpressions(\n    clusteredByExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    if (!clusteredByExpressions || isEmptyArray(clusteredByExpressions)) {\n      return this.changeClusteredByClause(undefined);\n    } else {\n      return this.changeClusteredByClause(\n        this.clusteredByClause\n          ? this.clusteredByClause.changeExpressions(clusteredByExpressions)\n          : SqlClusteredByClause.create(clusteredByExpressions),\n      );\n    }\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlWithQuery | undefined {\n    let ret: SqlWithQuery = this;\n\n    if (this.contextStatements) {\n      const contextStatements = SqlBase.walkSeparatedArray(\n        this.contextStatements,\n        nextStack,\n        fn,\n        postorder,\n      );\n      if (!contextStatements) return;\n      if (contextStatements !== this.contextStatements) {\n        ret = ret.changeContextStatements(contextStatements);\n      }\n    }\n\n    if (this.insertClause) {\n      const insertClause = this.insertClause._walkHelper(nextStack, fn, postorder);\n      if (!insertClause) return;\n      if (insertClause !== this.insertClause) {\n        ret = ret.changeInsertClause(insertClause as SqlInsertClause);\n      }\n    } else if (this.replaceClause) {\n      const replaceClause = this.replaceClause._walkHelper(nextStack, fn, postorder);\n      if (!replaceClause) return;\n      if (replaceClause !== this.replaceClause) {\n        ret = ret.changeReplaceClause(replaceClause as SqlReplaceClause);\n      }\n    }\n\n    const withClause = this.withClause._walkHelper(nextStack, fn, postorder);\n    if (!withClause) return;\n    if (withClause !== this.withClause) {\n      ret = ret.changeWithClause(withClause as SqlWithClause);\n    }\n\n    const query = this.query._walkHelper(nextStack, fn, postorder);\n    if (!query) return;\n    if (query !== this.query) {\n      ret = ret.changeQuery(query as SqlQuery);\n    }\n\n    if (this.orderByClause) {\n      const orderByClause = this.orderByClause._walkHelper(nextStack, fn, postorder);\n      if (!orderByClause) return;\n      if (orderByClause !== this.orderByClause) {\n        ret = ret.changeOrderByClause(orderByClause as SqlOrderByClause);\n      }\n    }\n\n    if (this.limitClause) {\n      const limitClause = this.limitClause._walkHelper(nextStack, fn, postorder);\n      if (!limitClause) return;\n      if (limitClause !== this.limitClause) {\n        ret = ret.changeLimitClause(limitClause as SqlLimitClause);\n      }\n    }\n\n    if (this.offsetClause) {\n      const offsetClause = this.offsetClause._walkHelper(nextStack, fn, postorder);\n      if (!offsetClause) return;\n      if (offsetClause !== this.offsetClause) {\n        ret = ret.changeOffsetClause(offsetClause as SqlOffsetClause);\n      }\n    }\n\n    if (this.partitionedByClause) {\n      const partitionedByClause = this.partitionedByClause._walkHelper(nextStack, fn, postorder);\n      if (!partitionedByClause) return;\n      if (partitionedByClause !== this.partitionedByClause) {\n        ret = ret.changePartitionedByClause(partitionedByClause as SqlPartitionedByClause);\n      }\n    }\n\n    if (this.clusteredByClause) {\n      const clusteredByClause = this.clusteredByClause._walkHelper(nextStack, fn, postorder);\n      if (!clusteredByClause) return;\n      if (clusteredByClause !== this.clusteredByClause) {\n        ret = ret.changeClusteredByClause(clusteredByClause as SqlClusteredByClause);\n      }\n    }\n\n    return ret;\n  }\n\n  /* ~~~~~ EXPLAIN ~~~~~ */\n\n  public makeExplain(): this {\n    return this.changeExplain(true);\n  }\n\n  /* ~~~~~ INSERT ~~~~~ */\n\n  public getInsertIntoTable(): SqlExpression | undefined {\n    return this.insertClause?.table;\n  }\n\n  public changeInsertIntoTable(table: SqlExpression | string | undefined): this {\n    const value = this.valueOf();\n    value.insertClause = table\n      ? value.insertClause\n        ? value.insertClause.changeTable(table)\n        : SqlInsertClause.create(table)\n      : undefined;\n    return SqlBase.fromValue(value);\n  }\n\n  /* ~~~~~ REPLACE ~~~~~ */\n\n  public getReplaceIntoTable(): SqlExpression | undefined {\n    return this.replaceClause?.table;\n  }\n\n  public changeReplaceIntoTable(table: SqlExpression | string | undefined): this {\n    return this.changeReplaceClause(\n      table\n        ? this.replaceClause\n          ? this.replaceClause.changeTable(table)\n          : SqlReplaceClause.create(table)\n        : undefined,\n    );\n  }\n\n  /* ~~~~~ INSERT + REPLACE ~~~~~ */\n\n  public getIngestTable(): SqlExpression | undefined {\n    return this.getInsertIntoTable() || this.getReplaceIntoTable();\n  }\n\n  /* ~~~~~ WITH ~~~~~ */\n\n  public getWithParts(): readonly SqlWithPart[] {\n    const { withClause } = this;\n    return withClause.withParts.values;\n  }\n\n  public changeWithParts(withParts: SeparatedArray<SqlWithPart> | SqlWithPart[]): this {\n    return this.changeWithClause(\n      this.withClause\n        ? this.withClause.changeWithParts(withParts)\n        : SqlWithClause.create(withParts),\n    );\n  }\n\n  public prependWith(name: string, query: SqlQuery): this {\n    return this.changeWithParts(\n      [SqlWithPart.simple(name, query.ensureParens())].concat(this.getWithParts()),\n    );\n  }\n\n  public flattenWith(): SqlQuery {\n    let flatQuery = this.query\n      .flattenWith()\n      .changeParens([])\n      .changeSpaces({ initial: this.spacing['initial'], final: this.spacing['final'] });\n\n    flatQuery = flatQuery.changeWithParts(this.getWithParts().concat(flatQuery.getWithParts()));\n\n    if (this.insertClause) {\n      flatQuery = flatQuery.changeInsertClause(this.insertClause);\n    } else if (this.replaceClause) {\n      flatQuery = flatQuery.changeReplaceClause(this.replaceClause);\n    }\n\n    if (this.orderByClause) {\n      flatQuery = flatQuery.changeOrderByClause(this.orderByClause);\n    }\n\n    if (this.limitClause) {\n      flatQuery = flatQuery.combineWithLimitClause(this.limitClause);\n    }\n\n    if (this.offsetClause) {\n      flatQuery = flatQuery.combineWithOffsetClause(this.offsetClause);\n    }\n\n    if (this.partitionedByClause) {\n      flatQuery = flatQuery.changePartitionedByClause(this.partitionedByClause);\n    }\n\n    if (this.clusteredByClause) {\n      flatQuery = flatQuery.changeClusteredByClause(this.clusteredByClause);\n    }\n\n    return flatQuery;\n  }\n\n  /* ~~~~~ ORDER BY ~~~~~ */\n\n  public hasOrderBy(): boolean {\n    return Boolean(this.orderByClause);\n  }\n\n  public getOrderByExpressions(): readonly SqlOrderByExpression[] {\n    const { orderByClause } = this;\n    if (!orderByClause) return [];\n    return orderByClause.expressions.values;\n  }\n\n  public getOrderByForExpression(ex: SqlExpression): SqlOrderByExpression | undefined {\n    if (!this.orderByClause) return;\n    return this.orderByClause.toArray().find(orderByExpression => {\n      return orderByExpression.expression.equals(ex);\n    });\n  }\n\n  public addOrderBy(orderBy: SqlOrderByExpression): this {\n    return this.changeOrderByClause(\n      this.orderByClause ? this.orderByClause.addFirst(orderBy) : SqlOrderByClause.create(orderBy),\n    );\n  }\n\n  /* ~~~~~ LIMIT ~~~~~ */\n\n  public hasLimit(): boolean {\n    return Boolean(this.limitClause);\n  }\n\n  /* ~~~~~ OFFSET ~~~~~ */\n\n  public hasOffset(): boolean {\n    return Boolean(this.offsetClause);\n  }\n}\n\nSqlBase.register(SqlWithQuery);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { filterMap, isEmptyArray } from '../../utils';\nimport {\n  clampIndex,\n  NEWLINE,\n  NEWLINE_INDENT,\n  normalizeIndex,\n  SeparatedArray,\n  Separator,\n  SPACE,\n} from '../helpers';\nimport { parse as parseSql } from '../parser';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlOrderByDirection, SqlPartitionedByClause } from '../sql-clause';\nimport {\n  SqlClusteredByClause,\n  SqlFromClause,\n  SqlGroupByClause,\n  SqlHavingClause,\n  SqlInsertClause,\n  SqlJoinPart,\n  SqlLimitClause,\n  SqlOffsetClause,\n  SqlOrderByClause,\n  SqlOrderByExpression,\n  SqlReplaceClause,\n  SqlWhereClause,\n  SqlWithClause,\n  SqlWithPart,\n} from '../sql-clause';\nimport { SqlColumn } from '../sql-column/sql-column';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlFunction } from '../sql-function/sql-function';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\nimport { SqlSetStatement } from '../sql-set-statement/sql-set-statement';\nimport { SqlStar } from '../sql-star/sql-star';\nimport { SqlTable } from '../sql-table/sql-table';\nimport { SqlWithQuery } from '../sql-with-query/sql-with-query';\n\nexport type SqlQueryDecorator = 'ALL' | 'DISTINCT';\n\nexport type InsertIndex = number | 'last-grouping' | 'last';\n\nexport interface ExpressionInfo {\n  expression: SqlExpression;\n  selectIndex: number;\n  outputColumn?: string;\n  orderByExpression?: SqlOrderByExpression;\n}\n\nexport interface AddSelectOptions {\n  insertIndex?: InsertIndex;\n  addToGroupBy?: 'start' | 'end';\n  groupByExpression?: SqlExpression;\n  addToOrderBy?: 'start' | 'end';\n  orderByExpression?: SqlOrderByExpression;\n  direction?: SqlOrderByDirection;\n}\n\nexport interface SqlQueryValue extends SqlBaseValue {\n  contextStatements?: SeparatedArray<SqlSetStatement>;\n  explain?: boolean;\n  insertClause?: SqlInsertClause;\n  replaceClause?: SqlReplaceClause;\n  withClause?: SqlWithClause;\n  decorator?: SqlQueryDecorator;\n  selectExpressions?: SeparatedArray<SqlExpression>;\n\n  fromClause?: SqlFromClause;\n  whereClause?: SqlWhereClause;\n  groupByClause?: SqlGroupByClause;\n  havingClause?: SqlHavingClause;\n  orderByClause?: SqlOrderByClause;\n  limitClause?: SqlLimitClause;\n  offsetClause?: SqlOffsetClause;\n  partitionedByClause?: SqlPartitionedByClause;\n  clusteredByClause?: SqlClusteredByClause;\n  unionQuery?: SqlQuery;\n}\n\nexport class SqlQuery extends SqlExpression {\n  static type: SqlTypeDesignator = 'query';\n\n  static readonly DEFAULT_EXPLAIN_PLAN_FOR_KEYWORD = 'EXPLAIN PLAN FOR';\n  static readonly DEFAULT_SELECT_KEYWORD = 'SELECT';\n  static readonly DEFAULT_UNION_KEYWORD = 'UNION ALL';\n\n  static from(from: string | SqlExpression | SqlFromClause): SqlQuery {\n    // Extract context from the inner query if given\n    let contextStatements: SeparatedArray<SqlSetStatement> | undefined;\n    if (from instanceof SqlExpression) {\n      const underlyingFrom = from.getUnderlyingExpression();\n      if (underlyingFrom instanceof SqlQuery || underlyingFrom instanceof SqlWithQuery) {\n        contextStatements = underlyingFrom.contextStatements;\n        if (contextStatements) {\n          from = from.changeUnderlyingExpression(underlyingFrom.changeContextStatements(undefined));\n        }\n      }\n    }\n\n    return new SqlQuery({\n      contextStatements,\n      fromClause:\n        from instanceof SqlFromClause\n          ? from\n          : SqlFromClause.create(\n              SeparatedArray.fromSingleValue(\n                typeof from === 'string' ? SqlTable.create(from) : from.convertToTable(),\n              ),\n            ),\n    });\n  }\n\n  static selectStarFrom(from: string | SqlExpression | SqlFromClause): SqlQuery {\n    return SqlQuery.from(from).changeSelectExpressions(\n      SeparatedArray.fromSingleValue(SqlStar.PLAIN),\n    );\n  }\n\n  /**\n   * @deprecated use selectStarFrom instead\n   */\n  static create(from: string | SqlExpression | SqlFromClause): SqlQuery {\n    return SqlQuery.selectStarFrom(from);\n  }\n\n  static parse(input: string | SqlQuery): SqlQuery {\n    if (typeof input === 'string') {\n      const parsed = parseSql(input);\n      if (!(parsed instanceof SqlQuery)) {\n        throw new Error('Provided SQL was not a query');\n      }\n      return parsed;\n    } else if (input instanceof SqlQuery) {\n      return input;\n    } else {\n      throw new Error('unknown input');\n    }\n  }\n\n  static maybeParse(input: string | SqlQuery): SqlQuery | undefined {\n    try {\n      return SqlQuery.parse(input);\n    } catch {\n      return;\n    }\n  }\n\n  static getSelectExpressionOutput(selectExpression: SqlExpression, i: number) {\n    return selectExpression.getOutputName() || `EXPR$${i}`;\n  }\n\n  static isPhonyOutputName(name: string) {\n    return /^EXPR\\$(?:\\d|[1-9]\\d*)$/.test(name);\n  }\n\n  public readonly contextStatements?: SeparatedArray<SqlSetStatement>;\n  public readonly explain?: boolean;\n  public readonly insertClause?: SqlInsertClause;\n  public readonly replaceClause?: SqlReplaceClause;\n  public readonly withClause?: SqlWithClause;\n  public readonly decorator?: SqlQueryDecorator;\n  public readonly selectExpressions?: SeparatedArray<SqlExpression>;\n  public readonly fromClause?: SqlFromClause;\n  public readonly whereClause?: SqlWhereClause;\n  public readonly groupByClause?: SqlGroupByClause;\n  public readonly havingClause?: SqlHavingClause;\n  public readonly orderByClause?: SqlOrderByClause;\n  public readonly limitClause?: SqlLimitClause;\n  public readonly partitionedByClause?: SqlPartitionedByClause;\n  public readonly clusteredByClause?: SqlClusteredByClause;\n  public readonly offsetClause?: SqlOffsetClause;\n  public readonly unionQuery?: SqlQuery;\n\n  constructor(options: SqlQueryValue) {\n    super(options, SqlQuery.type);\n    this.contextStatements = options.contextStatements;\n    this.explain = options.explain;\n    this.insertClause = options.insertClause;\n    this.replaceClause = options.replaceClause;\n    if (this.insertClause && this.replaceClause) {\n      throw new Error('SqlQuery can not have both an insertClause and a replaceClause');\n    }\n\n    this.withClause = options.withClause;\n    this.decorator = options.decorator;\n    this.selectExpressions = options.selectExpressions;\n    this.fromClause = options.fromClause;\n    this.whereClause = options.whereClause;\n    this.groupByClause = options.groupByClause;\n    this.havingClause = options.havingClause;\n    this.orderByClause = options.orderByClause;\n    this.limitClause = options.limitClause;\n    this.offsetClause = options.offsetClause;\n    this.partitionedByClause = options.partitionedByClause;\n    this.clusteredByClause = options.clusteredByClause;\n    this.unionQuery = options.unionQuery;\n  }\n\n  public valueOf(): SqlQueryValue {\n    const value = super.valueOf() as SqlQueryValue;\n    value.contextStatements = this.contextStatements;\n    value.explain = this.explain;\n    value.insertClause = this.insertClause;\n    value.replaceClause = this.replaceClause;\n    value.withClause = this.withClause;\n    value.decorator = this.decorator;\n    value.selectExpressions = this.selectExpressions;\n    value.fromClause = this.fromClause;\n    value.whereClause = this.whereClause;\n    value.groupByClause = this.groupByClause;\n    value.havingClause = this.havingClause;\n    value.orderByClause = this.orderByClause;\n    value.limitClause = this.limitClause;\n    value.offsetClause = this.offsetClause;\n    value.partitionedByClause = this.partitionedByClause;\n    value.clusteredByClause = this.clusteredByClause;\n    value.unionQuery = this.unionQuery;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const {\n      contextStatements,\n      explain,\n      insertClause,\n      replaceClause,\n      withClause,\n      decorator,\n      selectExpressions,\n      fromClause,\n      whereClause,\n      groupByClause,\n      havingClause,\n      orderByClause,\n      limitClause,\n      offsetClause,\n      partitionedByClause,\n      clusteredByClause,\n      unionQuery,\n    } = this;\n\n    const rawParts: string[] = [];\n\n    // SET clauses\n    if (contextStatements) {\n      rawParts.push(contextStatements.toString(NEWLINE), this.getSpace('postSets', NEWLINE));\n    }\n\n    // Explain\n    if (explain) {\n      rawParts.push(\n        this.getKeyword('explainPlanFor', SqlQuery.DEFAULT_EXPLAIN_PLAN_FOR_KEYWORD),\n        this.getSpace('postExplainPlanFor', NEWLINE),\n      );\n    }\n\n    // INSERT / REPLACE clause\n    if (insertClause) {\n      rawParts.push(insertClause.toString(), this.getSpace('postInsertClause', NEWLINE));\n    } else if (replaceClause) {\n      rawParts.push(replaceClause.toString(), this.getSpace('postReplaceClause', NEWLINE));\n    }\n\n    // WITH clause\n    if (withClause) {\n      rawParts.push(withClause.toString(), this.getSpace('postWithClause', NEWLINE));\n    }\n\n    const indentSpace =\n      selectExpressions && selectExpressions.length() > 1 ? NEWLINE_INDENT : SPACE;\n\n    // SELECT clause\n    rawParts.push(\n      this.getKeyword('select', SqlQuery.DEFAULT_SELECT_KEYWORD),\n      this.getSpace('postSelect', decorator ? SPACE : indentSpace),\n    );\n    if (this.decorator) {\n      rawParts.push(\n        this.getKeyword('decorator', this.decorator),\n        this.getSpace('postDecorator', indentSpace),\n      );\n    }\n\n    rawParts.push(\n      selectExpressions\n        ? selectExpressions.toString(new Separator({ separator: ',', right: indentSpace }))\n        : '...',\n    );\n\n    if (fromClause) {\n      rawParts.push(this.getSpace('preFromClause', NEWLINE), fromClause.toString());\n    }\n\n    if (whereClause) {\n      rawParts.push(this.getSpace('preWhereClause', NEWLINE), whereClause.toString());\n    }\n\n    if (groupByClause) {\n      rawParts.push(this.getSpace('preGroupByClause', NEWLINE), groupByClause.toString());\n    }\n\n    if (havingClause) {\n      rawParts.push(this.getSpace('preHavingClause', NEWLINE), havingClause.toString());\n    }\n\n    if (orderByClause) {\n      rawParts.push(this.getSpace('preOrderByClause', NEWLINE), orderByClause.toString());\n    }\n\n    if (limitClause) {\n      rawParts.push(this.getSpace('preLimitClause', NEWLINE), limitClause.toString());\n    }\n\n    if (offsetClause) {\n      rawParts.push(this.getSpace('preOffsetClause', NEWLINE), offsetClause.toString());\n    }\n\n    if (partitionedByClause) {\n      rawParts.push(\n        this.getSpace('prePartitionedByClause', NEWLINE),\n        partitionedByClause.toString(),\n      );\n    }\n\n    if (clusteredByClause) {\n      rawParts.push(this.getSpace('preClusteredByClause', NEWLINE), clusteredByClause.toString());\n    }\n\n    if (unionQuery) {\n      rawParts.push(\n        this.getSpace('preUnion', NEWLINE),\n        this.getKeyword('union', SqlQuery.DEFAULT_UNION_KEYWORD),\n        this.getSpace('postUnion'),\n        unionQuery.toString(),\n      );\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeContextStatements(\n    contextStatements: SeparatedArray<SqlSetStatement> | SqlSetStatement[] | undefined,\n  ): this {\n    const newContextStatements = SeparatedArray.fromPossiblyEmptyArray(contextStatements);\n    const value = this.valueOf();\n    if (newContextStatements) {\n      value.contextStatements = newContextStatements;\n    } else {\n      delete value.contextStatements;\n      value.spacing = this.getSpacingWithout('postSets');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public hasContext(): boolean {\n    return Boolean(this.contextStatements);\n  }\n\n  public getContext(): Record<string, any> {\n    return SqlSetStatement.contextStatementsToContext(this.contextStatements?.values);\n  }\n\n  public changeContext(context: Record<string, any> | undefined): this {\n    return this.changeContextStatements(\n      context ? SqlSetStatement.contextToContextStatements(context) : undefined,\n    );\n  }\n\n  public changeExplain(explain: boolean): this {\n    if (this.explain === explain) return this;\n    const value = this.valueOf();\n    if (explain) {\n      value.explain = true;\n    } else {\n      delete value.explain;\n      value.spacing = this.getSpacingWithout('postExplainPlanFor');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeInsertClause(insertClause: SqlInsertClause | undefined): this {\n    if (this.insertClause === insertClause) return this;\n    const value = this.valueOf();\n    if (insertClause) {\n      value.insertClause = insertClause;\n    } else {\n      delete value.insertClause;\n      value.spacing = this.getSpacingWithout('postInsertClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeReplaceClause(replaceClause: SqlReplaceClause | undefined): this {\n    if (this.replaceClause === replaceClause) return this;\n    const value = this.valueOf();\n    if (replaceClause) {\n      value.replaceClause = replaceClause;\n    } else {\n      delete value.replaceClause;\n      value.spacing = this.getSpacingWithout('postReplaceClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWithClause(withClause: SqlWithClause | undefined): this {\n    if (this.withClause === withClause) return this;\n    const value = this.valueOf();\n    if (withClause) {\n      value.withClause = withClause;\n    } else {\n      delete value.withClause;\n      value.spacing = this.getSpacingWithout('postWithClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeDecorator(decorator: SqlQueryDecorator | undefined): this {\n    const value = this.valueOf();\n    value.decorator = decorator;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeSelectExpressions(\n    selectExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    if (this.selectExpressions === selectExpressions) return this;\n    const value = this.valueOf();\n    if (selectExpressions) {\n      value.selectExpressions = SeparatedArray.fromArray(selectExpressions);\n    } else {\n      delete value.selectExpressions;\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeFromClause(fromClause: SqlFromClause | undefined): this {\n    if (this.fromClause === fromClause) return this;\n    const value = this.valueOf();\n    if (fromClause) {\n      value.fromClause = fromClause;\n    } else {\n      delete value.fromClause;\n      value.spacing = this.getSpacingWithout('preFromClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeFromExpressions(\n    fromExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    if (!fromExpressions) return this.changeFromClause(undefined);\n    return this.changeFromClause(\n      this.fromClause\n        ? this.fromClause.changeExpressions(fromExpressions)\n        : SqlFromClause.create(fromExpressions),\n    );\n  }\n\n  public changeWhereClause(whereClause: SqlWhereClause | undefined): this {\n    if (this.whereClause === whereClause) return this;\n    const value = this.valueOf();\n    if (whereClause) {\n      value.whereClause = whereClause;\n    } else {\n      delete value.whereClause;\n      value.spacing = this.getSpacingWithout('preWhereClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWhereExpression(whereExpression: SqlExpression | undefined): this {\n    if (!whereExpression || SqlLiteral.isTrue(whereExpression)) {\n      return this.changeWhereClause(undefined);\n    }\n    return this.changeWhereClause(\n      this.whereClause\n        ? this.whereClause.changeExpression(whereExpression)\n        : SqlWhereClause.create(whereExpression),\n    );\n  }\n\n  public changeGroupByClause(groupByClause: SqlGroupByClause | undefined): this {\n    if (this.groupByClause === groupByClause) return this;\n    const value = this.valueOf();\n    if (groupByClause) {\n      value.groupByClause = groupByClause;\n    } else {\n      delete value.groupByClause;\n      value.spacing = this.getSpacingWithout('preGroupByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getGroupByExpressions(): readonly SqlExpression[] | undefined {\n    return this.groupByClause?.toArray();\n  }\n\n  public changeGroupByExpressions(\n    groupByExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    if (typeof groupByExpressions === 'undefined') return this.changeGroupByClause(undefined);\n    return this.changeGroupByClause(\n      this.groupByClause\n        ? this.groupByClause.changeExpressions(groupByExpressions)\n        : SqlGroupByClause.create(groupByExpressions),\n    );\n  }\n\n  public changeHavingClause(havingClause: SqlHavingClause | undefined): this {\n    if (this.havingClause === havingClause) return this;\n    const value = this.valueOf();\n    if (havingClause) {\n      value.havingClause = havingClause;\n    } else {\n      delete value.havingClause;\n      value.spacing = this.getSpacingWithout('preHavingClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeHavingExpression(havingExpression: SqlExpression | undefined): this {\n    if (!havingExpression || SqlLiteral.isTrue(havingExpression)) {\n      return this.changeHavingClause(undefined);\n    }\n    return this.changeHavingClause(\n      this.havingClause\n        ? this.havingClause.changeExpression(havingExpression)\n        : SqlHavingClause.create(havingExpression),\n    );\n  }\n\n  public changeOrderByClause(orderByClause: SqlOrderByClause | undefined): this {\n    if (this.orderByClause === orderByClause) return this;\n    const value = this.valueOf();\n    if (orderByClause) {\n      value.orderByClause = orderByClause;\n    } else {\n      delete value.orderByClause;\n      value.spacing = this.getSpacingWithout('preOrderByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByExpressions(\n    orderByExpressions: SeparatedArray<SqlOrderByExpression> | SqlOrderByExpression[] | undefined,\n  ): this {\n    if (!orderByExpressions || isEmptyArray(orderByExpressions)) {\n      return this.changeOrderByClause(undefined);\n    } else {\n      return this.changeOrderByClause(\n        this.orderByClause\n          ? this.orderByClause.changeExpressions(orderByExpressions)\n          : SqlOrderByClause.create(orderByExpressions),\n      );\n    }\n  }\n\n  public changeOrderByExpression(orderByExpression: SqlOrderByExpression | undefined): this {\n    if (!orderByExpression) return this.changeOrderByClause(undefined);\n    return this.changeOrderByExpressions([orderByExpression]);\n  }\n\n  public changeLimitClause(limitClause: SqlLimitClause | undefined): this {\n    if (this.limitClause === limitClause) return this;\n    const value = this.valueOf();\n    if (limitClause) {\n      value.limitClause = limitClause;\n    } else {\n      delete value.limitClause;\n      value.spacing = this.getSpacingWithout('preLimitClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getLimitValue(): number | undefined {\n    return this.limitClause?.getLimitValue();\n  }\n\n  public changeLimitValue(limitValue: SqlLiteral | number | undefined): this {\n    if (typeof limitValue === 'number' && limitValue < 0) {\n      throw new Error(`${limitValue} is not a valid limit value`);\n    }\n    if (typeof limitValue === 'undefined') return this.changeLimitClause(undefined);\n    if (typeof limitValue === 'number' && !isFinite(limitValue)) {\n      return this.changeLimitClause(undefined);\n    }\n    return this.changeLimitClause(\n      this.limitClause\n        ? this.limitClause.changeLimit(limitValue)\n        : SqlLimitClause.create(limitValue),\n    );\n  }\n\n  public changeOffsetClause(offsetClause: SqlOffsetClause | undefined): this {\n    if (this.offsetClause === offsetClause) return this;\n    const value = this.valueOf();\n    if (offsetClause) {\n      value.offsetClause = offsetClause;\n    } else {\n      delete value.offsetClause;\n      value.spacing = this.getSpacingWithout('preOffsetClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getOffsetValue(): number | undefined {\n    return this.offsetClause?.getOffsetValue();\n  }\n\n  public changeOffsetValue(offsetValue: SqlLiteral | number | undefined): this {\n    if (typeof offsetValue === 'undefined') return this.changeOffsetClause(undefined);\n    return this.changeOffsetClause(\n      this.offsetClause\n        ? this.offsetClause.changeOffset(offsetValue)\n        : SqlOffsetClause.create(offsetValue),\n    );\n  }\n\n  public changePartitionedByClause(partitionedByClause: SqlPartitionedByClause | undefined): this {\n    if (this.partitionedByClause === partitionedByClause) return this;\n    const value = this.valueOf();\n    if (partitionedByClause) {\n      value.partitionedByClause = partitionedByClause;\n    } else {\n      delete value.partitionedByClause;\n      value.spacing = this.getSpacingWithout('prePartitionedByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeClusteredByClause(clusteredByClause: SqlClusteredByClause | undefined): this {\n    if (this.clusteredByClause === clusteredByClause) return this;\n    const value = this.valueOf();\n    if (clusteredByClause) {\n      value.clusteredByClause = clusteredByClause;\n    } else {\n      delete value.clusteredByClause;\n      value.spacing = this.getSpacingWithout('preClusteredByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeClusteredByExpressions(\n    clusteredByExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    if (!clusteredByExpressions || isEmptyArray(clusteredByExpressions)) {\n      return this.changeClusteredByClause(undefined);\n    } else {\n      return this.changeClusteredByClause(\n        this.clusteredByClause\n          ? this.clusteredByClause.changeExpressions(clusteredByExpressions)\n          : SqlClusteredByClause.create(clusteredByExpressions),\n      );\n    }\n  }\n\n  public changeUnionQuery(unionQuery: SqlQuery | undefined): this {\n    const value = this.valueOf();\n    if (typeof unionQuery === 'undefined') {\n      delete value.unionQuery;\n      value.spacing = this.getSpacingWithout('preUnion', 'postUnion');\n      value.keywords = this.getKeywordsWithout('union');\n    } else {\n      value.unionQuery = unionQuery;\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlQuery | undefined {\n    let ret: SqlQuery = this;\n\n    if (this.contextStatements) {\n      const contextStatements = SqlBase.walkSeparatedArray(\n        this.contextStatements,\n        nextStack,\n        fn,\n        postorder,\n      );\n      if (!contextStatements) return;\n      if (contextStatements !== this.contextStatements) {\n        ret = ret.changeContextStatements(contextStatements);\n      }\n    }\n\n    if (this.insertClause) {\n      const insertClause = this.insertClause._walkHelper(nextStack, fn, postorder);\n      if (!insertClause) return;\n      if (insertClause !== this.insertClause) {\n        ret = ret.changeInsertClause(insertClause as SqlInsertClause);\n      }\n    } else if (this.replaceClause) {\n      const replaceClause = this.replaceClause._walkHelper(nextStack, fn, postorder);\n      if (!replaceClause) return;\n      if (replaceClause !== this.replaceClause) {\n        ret = ret.changeReplaceClause(replaceClause as SqlReplaceClause);\n      }\n    }\n\n    if (this.withClause) {\n      const withClause = this.withClause._walkHelper(nextStack, fn, postorder);\n      if (!withClause) return;\n      if (withClause !== this.withClause) {\n        ret = ret.changeWithClause(withClause as SqlWithClause);\n      }\n    }\n\n    if (this.selectExpressions) {\n      const selectExpressions = SqlBase.walkSeparatedArray(\n        this.selectExpressions,\n        nextStack,\n        fn,\n        postorder,\n      );\n      if (!selectExpressions) return;\n      if (selectExpressions !== this.selectExpressions) {\n        ret = ret.changeSelectExpressions(selectExpressions);\n      }\n    }\n\n    if (this.fromClause) {\n      const fromClause = this.fromClause._walkHelper(nextStack, fn, postorder);\n      if (!fromClause) return;\n      if (fromClause !== this.fromClause) {\n        ret = ret.changeFromClause(fromClause as SqlFromClause);\n      }\n    }\n\n    if (this.whereClause) {\n      const whereClause = this.whereClause._walkHelper(nextStack, fn, postorder);\n      if (!whereClause) return;\n      if (whereClause !== this.whereClause) {\n        ret = ret.changeWhereClause(whereClause as SqlWhereClause);\n      }\n    }\n\n    if (this.groupByClause) {\n      const groupByClause = this.groupByClause._walkHelper(nextStack, fn, postorder);\n      if (!groupByClause) return;\n      if (groupByClause !== this.groupByClause) {\n        ret = ret.changeGroupByClause(groupByClause as SqlGroupByClause);\n      }\n    }\n\n    if (this.havingClause) {\n      const havingClause = this.havingClause._walkHelper(nextStack, fn, postorder);\n      if (!havingClause) return;\n      if (havingClause !== this.havingClause) {\n        ret = ret.changeHavingClause(havingClause as SqlHavingClause);\n      }\n    }\n\n    if (this.orderByClause) {\n      const orderByClause = this.orderByClause._walkHelper(nextStack, fn, postorder);\n      if (!orderByClause) return;\n      if (orderByClause !== this.orderByClause) {\n        ret = ret.changeOrderByClause(orderByClause as SqlOrderByClause);\n      }\n    }\n\n    if (this.limitClause) {\n      const limitClause = this.limitClause._walkHelper(nextStack, fn, postorder);\n      if (!limitClause) return;\n      if (limitClause !== this.limitClause) {\n        ret = ret.changeLimitClause(limitClause as SqlLimitClause);\n      }\n    }\n\n    if (this.offsetClause) {\n      const offsetClause = this.offsetClause._walkHelper(nextStack, fn, postorder);\n      if (!offsetClause) return;\n      if (offsetClause !== this.offsetClause) {\n        ret = ret.changeOffsetClause(offsetClause as SqlOffsetClause);\n      }\n    }\n\n    if (this.partitionedByClause) {\n      const partitionedByClause = this.partitionedByClause._walkHelper(nextStack, fn, postorder);\n      if (!partitionedByClause) return;\n      if (partitionedByClause !== this.partitionedByClause) {\n        ret = ret.changePartitionedByClause(partitionedByClause as SqlPartitionedByClause);\n      }\n    }\n\n    if (this.clusteredByClause) {\n      const clusteredByClause = this.clusteredByClause._walkHelper(nextStack, fn, postorder);\n      if (!clusteredByClause) return;\n      if (clusteredByClause !== this.clusteredByClause) {\n        ret = ret.changeClusteredByClause(clusteredByClause as SqlClusteredByClause);\n      }\n    }\n\n    if (this.unionQuery) {\n      const unionQuery = this.unionQuery._walkHelper(nextStack, fn, postorder);\n      if (!unionQuery) return;\n      if (unionQuery !== this.unionQuery) {\n        ret = ret.changeUnionQuery(unionQuery as SqlQuery);\n      }\n    }\n\n    return ret;\n  }\n\n  /* ~~~~~ General stuff ~~~~~ */\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.selectExpressions = this.selectExpressions?.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  /* ~~~~~ EXPLAIN ~~~~~ */\n\n  public makeExplain(): this {\n    return this.changeExplain(true);\n  }\n\n  /* ~~~~~ INSERT ~~~~~ */\n\n  public getInsertIntoTable(): SqlExpression | undefined {\n    return this.insertClause?.table;\n  }\n\n  public changeInsertIntoTable(table: SqlTable | string | undefined): this {\n    return this.changeInsertClause(\n      table\n        ? this.insertClause\n          ? this.insertClause.changeTable(table)\n          : SqlInsertClause.create(table)\n        : undefined,\n    );\n  }\n\n  /* ~~~~~ REPLACE ~~~~~ */\n\n  public getReplaceIntoTable(): SqlExpression | undefined {\n    return this.replaceClause?.table;\n  }\n\n  public changeReplaceIntoTable(table: SqlExpression | string | undefined): this {\n    return this.changeReplaceClause(\n      table\n        ? this.replaceClause\n          ? this.replaceClause.changeTable(table)\n          : SqlReplaceClause.create(table)\n        : undefined,\n    );\n  }\n\n  /* ~~~~~ INSERT + REPLACE ~~~~~ */\n\n  public getIngestTable(): SqlExpression | undefined {\n    return this.getInsertIntoTable() || this.getReplaceIntoTable();\n  }\n\n  /* ~~~~~ WITH ~~~~~ */\n\n  public getWithParts(): readonly SqlWithPart[] {\n    const { withClause } = this;\n    if (!withClause) return [];\n    return withClause.withParts.values;\n  }\n\n  public changeWithParts(withParts: SeparatedArray<SqlWithPart> | SqlWithPart[] | undefined): this {\n    if (!withParts || isEmptyArray(withParts)) {\n      return this.changeWithClause(undefined);\n    } else {\n      return this.changeWithClause(\n        this.withClause\n          ? this.withClause.changeWithParts(withParts)\n          : SqlWithClause.create(withParts),\n      );\n    }\n  }\n\n  public prependWith(name: string, query: SqlQuery): this {\n    return this.changeWithParts(\n      [SqlWithPart.simple(name, query.ensureParens())].concat(this.getWithParts()),\n    );\n  }\n\n  public flattenWith(): SqlQuery {\n    return this;\n  }\n\n  /* ~~~~~ SELECT ~~~~~ */\n\n  public isValidSelectIndex(selectIndex: number): boolean {\n    const { selectExpressions } = this;\n    if (!selectExpressions) return false;\n    return 0 <= selectIndex && selectIndex < selectExpressions.length();\n  }\n\n  public getSelectExpressionsArray(): readonly SqlExpression[] {\n    return this.selectExpressions?.values || [];\n  }\n\n  public getSelectExpressionForIndex(selectIndex: number): SqlExpression | undefined {\n    return this.selectExpressions?.get(selectIndex);\n  }\n\n  public hasStarInSelect(): boolean {\n    return this.getSelectExpressionsArray().some(v => v instanceof SqlStar);\n  }\n\n  public getOutputColumns(): string[] {\n    return this.getSelectExpressionsArray().map(SqlQuery.getSelectExpressionOutput);\n  }\n\n  public getSelectIndexesForColumn(column: string): number[] {\n    return filterMap(this.getSelectExpressionsArray(), (selectExpression, i) => {\n      return selectExpression.containsColumnName(column) ? i : undefined;\n    });\n  }\n\n  public getGroupedSelectIndexesForColumn(column: string): number[] {\n    return this.getSelectIndexesForColumn(column).filter(selectIndex =>\n      this.isGroupedSelectIndex(selectIndex),\n    );\n  }\n\n  public getSelectIndexForOutputColumn(outputColumn: string): number {\n    return this.getSelectExpressionsArray().findIndex((selectExpression, i) => {\n      return SqlQuery.getSelectExpressionOutput(selectExpression, i) === outputColumn;\n    });\n  }\n\n  private expressionRefersToSelectIndex(\n    ex: SqlExpression,\n    selectIndex: number,\n    allowAliasReferences: boolean,\n  ): boolean {\n    const selectExpression = this.getSelectExpressionForIndex(selectIndex);\n    if (!selectExpression) return false;\n\n    if (ex instanceof SqlLiteral && ex.isIndex()) {\n      return selectIndex === ex.getIndexValue();\n    }\n\n    if (allowAliasReferences && ex instanceof SqlColumn) {\n      return selectExpression.getOutputName() === ex.getName();\n    }\n\n    return selectExpression.getUnderlyingExpression().contains(ex);\n  }\n\n  public getSelectIndexForExpression(ex: SqlExpression, allowAliasReferences: boolean): number {\n    const selectExpressionsArray = this.getSelectExpressionsArray();\n\n    if (ex instanceof SqlLiteral && ex.isIndex()) {\n      const idx = ex.getIndexValue();\n      return this.isValidSelectIndex(idx) ? idx : -1;\n    }\n\n    if (allowAliasReferences && ex instanceof SqlColumn) {\n      const refIdx = selectExpressionsArray.findIndex((selectExpression, i) => {\n        return SqlQuery.getSelectExpressionOutput(selectExpression, i) === ex.getName();\n      });\n      if (refIdx !== -1) {\n        return refIdx;\n      }\n    }\n\n    return selectExpressionsArray.findIndex(selectExpression => {\n      return ex.equals(selectExpression.getUnderlyingExpression());\n    });\n  }\n\n  public isRealOutputColumnAtSelectIndex(selectIndex: number): boolean {\n    const selectExpression = this.getSelectExpressionForIndex(selectIndex);\n    if (!selectExpression) return false;\n    return Boolean(selectExpression.getOutputName());\n  }\n\n  public isGroupedSelectIndex(selectIndex: number): boolean {\n    const { groupByClause } = this;\n    if (!groupByClause || !this.isValidSelectIndex(selectIndex)) return false;\n    return groupByClause\n      .toArray()\n      .some(ex => this.expressionRefersToSelectIndex(ex, selectIndex, false));\n  }\n\n  public isGroupedOutputColumn(outputColumn: string): boolean {\n    return this.isGroupedSelectIndex(this.getSelectIndexForOutputColumn(outputColumn));\n  }\n\n  public getGroupedSelectExpressions(): SqlExpression[] {\n    if (!this.hasGroupBy()) return [];\n    return this.getSelectExpressionsArray().filter((_selectExpression, i) => {\n      return this.isGroupedSelectIndex(i);\n    });\n  }\n\n  getGroupedOutputColumns(): string[] {\n    if (!this.hasGroupBy()) return [];\n    return filterMap(this.getSelectExpressionsArray(), (selectExpression, i) => {\n      if (!this.isGroupedSelectIndex(i)) return;\n      return SqlQuery.getSelectExpressionOutput(selectExpression, i);\n    });\n  }\n\n  isAggregateSelectIndex(selectIndex: number): boolean {\n    const { groupByClause } = this;\n    if (!groupByClause || !this.isValidSelectIndex(selectIndex)) return false;\n    return !this.isGroupedSelectIndex(selectIndex);\n  }\n\n  isAggregateOutputColumn(outputColumn: string): boolean {\n    return this.isAggregateSelectIndex(this.getSelectIndexForOutputColumn(outputColumn));\n  }\n\n  getAggregateSelectExpressions(): SqlExpression[] {\n    if (!this.groupByClause) return [];\n    return this.getSelectExpressionsArray().filter((_selectExpression, i) => {\n      return this.isAggregateSelectIndex(i);\n    });\n  }\n\n  getAggregateOutputColumns(): string[] {\n    if (!this.groupByClause) return [];\n    return filterMap(this.getSelectExpressionsArray(), (selectExpression, i) => {\n      if (!this.isAggregateSelectIndex(i)) return;\n      return SqlQuery.getSelectExpressionOutput(selectExpression, i);\n    });\n  }\n\n  private decodeInsertIndex(insertIndex: InsertIndex = 'last'): number {\n    const selectExpressionsArray = this.getSelectExpressionsArray();\n    if (insertIndex === 'last-grouping') {\n      return selectExpressionsArray.reduce<number>((maxSeenGrouping, _, i) => {\n        return this.isGroupedSelectIndex(i) ? i + 1 : maxSeenGrouping;\n      }, 0);\n    } else if (insertIndex === 'last') {\n      return selectExpressionsArray.length;\n    } else if (typeof insertIndex === 'number') {\n      const n = selectExpressionsArray.length;\n      return clampIndex(normalizeIndex(insertIndex, n), 0, n);\n    } else {\n      throw new Error(`unsupported insert index (${insertIndex})`);\n    }\n  }\n\n  public addSelect(ex: SqlExpression, options: AddSelectOptions = {}): this {\n    const {\n      insertIndex,\n      addToGroupBy,\n      groupByExpression,\n      addToOrderBy,\n      orderByExpression,\n      direction,\n    } = options;\n    const idx = this.decodeInsertIndex(insertIndex);\n\n    const selectExpressions =\n      this.selectExpressions?.insert(idx, ex) || SeparatedArray.fromSingleValue(ex);\n\n    let groupByClause = this.groupByClause?.shiftIndexes(idx);\n    if (addToGroupBy || groupByExpression) {\n      const indexLiteral = groupByExpression ?? SqlLiteral.index(idx);\n      groupByClause = groupByClause\n        ? groupByClause.addExpression(indexLiteral, addToGroupBy)\n        : SqlGroupByClause.create([indexLiteral]);\n    }\n\n    let orderByClause = this.orderByClause?.shiftIndexes(idx);\n    if (addToOrderBy || orderByExpression) {\n      const newOrderBy = orderByExpression ?? SqlOrderByExpression.index(idx, direction);\n      orderByClause = orderByClause\n        ? orderByClause.addExpression(newOrderBy, addToOrderBy)\n        : SqlOrderByClause.create([newOrderBy]);\n    }\n\n    return this.changeSelectExpressions(selectExpressions)\n      .changeGroupByClause(groupByClause)\n      .changeOrderByClause(orderByClause);\n  }\n\n  public changeSelect(selectIndex: number, ex: SqlExpression): this {\n    if (!this.selectExpressions) return this;\n    return this.changeSelectExpressions(this.selectExpressions.change(selectIndex, ex));\n  }\n\n  public removeSelectIndex(selectIndex: number): this {\n    if (!this.selectExpressions) return this;\n    const selectExpression = this.getSelectExpressionForIndex(selectIndex);\n    if (!selectExpression) return this;\n\n    const newSelectExpressions = this.selectExpressions.remove(selectIndex);\n\n    let ret = this;\n\n    if (this.groupByClause) {\n      ret = ret.changeGroupByClause(\n        this.groupByClause.removeExpression(selectExpression, selectIndex),\n      );\n    }\n\n    if (this.orderByClause) {\n      ret = ret.changeOrderByClause(\n        this.orderByClause.removeExpression(selectExpression, selectIndex),\n      );\n    }\n\n    return ret.changeSelectExpressions(newSelectExpressions);\n  }\n\n  public removeSelectIndexes(selectIndexes: number[]): this {\n    return this.applyForEach(\n      selectIndexes.slice().sort((a, b) => b - a),\n      (a, idx) => a.removeSelectIndex(idx),\n    );\n  }\n\n  public removeOutputColumn(outputColumn: string) {\n    return this.removeSelectIndex(this.getSelectIndexForOutputColumn(outputColumn));\n  }\n\n  /* ~~~~~ FROM ~~~~~ */\n\n  public hasFrom(): boolean {\n    return Boolean(this.fromClause);\n  }\n\n  public getFromExpressions(): readonly SqlExpression[] {\n    if (!this.fromClause) return [];\n    return this.fromClause.expressions.values;\n  }\n\n  public getFirstFromExpression(): SqlExpression | undefined {\n    if (!this.fromClause) return;\n    return this.fromClause.expressions.first();\n  }\n\n  public hasJoin(): boolean {\n    if (!this.fromClause) return false;\n    return this.fromClause.hasJoin();\n  }\n\n  public getJoins(): readonly SqlJoinPart[] {\n    if (!this.fromClause) return [];\n    return this.fromClause.getJoins();\n  }\n\n  public addJoin(join: SqlJoinPart) {\n    if (!this.fromClause) return this;\n    return this.changeFromClause(this.fromClause.addJoin(join));\n  }\n\n  public addLeftJoin(table: SqlExpression, onExpression: SqlExpression | SqlExpression[]) {\n    return this.addJoin(SqlJoinPart.create('LEFT', table, onExpression));\n  }\n\n  public addRightJoin(table: SqlExpression, onExpression: SqlExpression | SqlExpression[]) {\n    return this.addJoin(SqlJoinPart.create('RIGHT', table, onExpression));\n  }\n\n  public addInnerJoin(table: SqlExpression, onExpression: SqlExpression | SqlExpression[]) {\n    return this.addJoin(SqlJoinPart.create('INNER', table, onExpression));\n  }\n\n  public addFullJoin(table: SqlExpression, onExpression: SqlExpression | SqlExpression[]) {\n    return this.addJoin(SqlJoinPart.create('FULL', table, onExpression));\n  }\n\n  public addCrossJoin(table: SqlExpression) {\n    return this.addJoin(SqlJoinPart.cross(table));\n  }\n\n  public removeAllJoins() {\n    if (!this.fromClause) return this;\n    return this.changeFromClause(this.fromClause.changeJoinParts(undefined));\n  }\n\n  /* ~~~~~ WHERE ~~~~~ */\n\n  public hasWhere(): boolean {\n    return Boolean(this.whereClause);\n  }\n\n  public getWhereExpression(): SqlExpression | undefined {\n    if (!this.whereClause) return;\n    return this.whereClause.expression;\n  }\n\n  public getEffectiveWhereExpression(): SqlExpression {\n    if (!this.whereClause) return SqlLiteral.TRUE;\n    return this.whereClause.expression;\n  }\n\n  public addWhere(...ex: SqlExpression[]) {\n    if (!ex.length) return this;\n    return this.changeWhereExpression(SqlExpression.and(this.getWhereExpression(), ...ex));\n  }\n\n  // Removes all filters on the specified column from the where clause\n  public removeColumnFromWhere(column: string) {\n    if (!this.whereClause) return this;\n    return this.changeWhereClause(this.whereClause.removeColumnFromAnd(column));\n  }\n\n  /* ~~~~~ GROUP BY ~~~~~ */\n\n  public hasGroupBy(): boolean {\n    return Boolean(this.groupByClause);\n  }\n\n  public getGroupingExpressionInfos(): ExpressionInfo[] {\n    const { groupByClause } = this;\n    if (!groupByClause) return [];\n\n    return groupByClause.toArray().map(ex => {\n      const selectIndex = this.getSelectIndexForExpression(ex, true);\n      if (selectIndex === -1) {\n        return {\n          expression: ex,\n          selectIndex,\n          orderByExpression: this.getOrderByForExpression(ex),\n        };\n      } else {\n        const selectExpression = this.getSelectExpressionForIndex(selectIndex)!;\n        return {\n          expression: selectExpression.getUnderlyingExpression(),\n          selectIndex,\n          outputColumn: SqlQuery.getSelectExpressionOutput(selectExpression, selectIndex),\n          orderByExpression: this.getOrderByForSelectIndex(selectIndex),\n        };\n      }\n    });\n  }\n\n  public getGroupingExpressions(): SqlExpression[] {\n    return this.getGroupingExpressionInfos().map(info => info.expression);\n  }\n\n  public addGroupBy(ex: SqlExpression) {\n    return this.changeGroupByClause(\n      this.groupByClause ? this.groupByClause.addExpression(ex) : SqlGroupByClause.create([ex]),\n    );\n  }\n\n  /* ~~~~~ HAVING ~~~~~ */\n\n  public hasHaving(): boolean {\n    return Boolean(this.havingClause);\n  }\n\n  public getHavingExpression(): SqlExpression | undefined {\n    if (!this.havingClause) return;\n    return this.havingClause.expression;\n  }\n\n  public getEffectiveHavingExpression(): SqlExpression {\n    if (!this.havingClause) return SqlLiteral.TRUE;\n    return this.havingClause.expression;\n  }\n\n  public addHaving(...ex: SqlExpression[]) {\n    if (!ex.length) return this;\n    return this.changeHavingExpression(SqlExpression.and(this.getHavingExpression(), ...ex));\n  }\n\n  public removeFromHaving(column: string) {\n    if (!this.havingClause) return this;\n    return this.changeHavingClause(this.havingClause.removeColumnFromAnd(column));\n  }\n\n  /* ~~~~~ ORDER BY ~~~~~ */\n\n  public hasOrderBy(): boolean {\n    return Boolean(this.orderByClause);\n  }\n\n  public getOrderByExpressions(): readonly SqlOrderByExpression[] {\n    const { orderByClause } = this;\n    if (!orderByClause) return [];\n    return orderByClause.expressions.values;\n  }\n\n  public getOrderByForSelectIndex(selectIndex: number): SqlOrderByExpression | undefined {\n    if (!this.orderByClause || !this.isValidSelectIndex(selectIndex)) return;\n    return this.orderByClause\n      .toArray()\n      .find(orderByExpression =>\n        this.expressionRefersToSelectIndex(orderByExpression.expression, selectIndex, true),\n      );\n  }\n\n  public getOrderByForExpression(ex: SqlExpression): SqlOrderByExpression | undefined {\n    if (!this.orderByClause) return;\n    return this.orderByClause.toArray().find(orderByExpression => {\n      return orderByExpression.expression.equals(ex);\n    });\n  }\n\n  public getOrderByForOutputColumn(outputColumn: string): SqlOrderByExpression | undefined {\n    return this.getOrderByForSelectIndex(this.getSelectIndexForOutputColumn(outputColumn));\n  }\n\n  public getOrderedSelectExpressions() {\n    if (!this.orderByClause) return [];\n    return this.getSelectExpressionsArray().filter((_selectExpression, i) => {\n      return this.getOrderByForSelectIndex(i);\n    });\n  }\n\n  public getOrderedOutputColumns() {\n    if (!this.orderByClause) return [];\n    return filterMap(this.getSelectExpressionsArray(), (selectExpression, i) => {\n      if (!this.getOrderByForSelectIndex(i)) return;\n      return SqlQuery.getSelectExpressionOutput(selectExpression, i);\n    });\n  }\n\n  public removeOrderByForSelectIndex(selectIndex: number): this {\n    if (!this.orderByClause || !this.isValidSelectIndex(selectIndex)) return this;\n    return this.changeOrderByExpressions(\n      this.orderByClause.expressions.filter(orderByExpression =>\n        this.expressionRefersToSelectIndex(orderByExpression.expression, selectIndex, true),\n      ),\n    );\n  }\n\n  public removeOrderByForOutputColumn(outputColumn: string) {\n    return this.removeOrderByForSelectIndex(this.getSelectIndexForOutputColumn(outputColumn));\n  }\n\n  public addOrderBy(orderBy: SqlOrderByExpression): this {\n    return this.changeOrderByClause(\n      this.orderByClause ? this.orderByClause.addFirst(orderBy) : SqlOrderByClause.create(orderBy),\n    );\n  }\n\n  /* ~~~~~ LIMIT ~~~~~ */\n\n  public hasLimit(): boolean {\n    return Boolean(this.limitClause);\n  }\n\n  public combineWithLimitClause(otherLimitClause: SqlLimitClause): SqlQuery {\n    if (this.limitClause) {\n      return this.changeLimitValue(\n        Math.min(this.limitClause.getLimitValue(), otherLimitClause.getLimitValue()),\n      );\n    } else {\n      return this.changeLimitClause(otherLimitClause);\n    }\n  }\n\n  /* ~~~~~ OFFSET ~~~~~ */\n\n  public hasOffset(): boolean {\n    return Boolean(this.offsetClause);\n  }\n\n  public combineWithOffsetClause(otherOffsetClause: SqlOffsetClause): SqlQuery {\n    if (this.offsetClause) {\n      return this.changeOffsetValue(\n        this.offsetClause.getOffsetValue() + otherOffsetClause.getOffsetValue(),\n      );\n    } else {\n      return this.changeOffsetClause(otherOffsetClause);\n    }\n  }\n\n  public inlineMaxDataTime(maxTime: number | undefined): SqlQuery {\n    const MAX_DATA_TIME = 'MAX_DATA_TIME';\n    const maxDataTime = maxTime ? new Date(maxTime) : new Date();\n\n    return this.walk(ex => {\n      if (ex instanceof SqlFunction && ex.getEffectiveFunctionName() === MAX_DATA_TIME) {\n        return SqlLiteral.create(maxDataTime);\n      }\n      return ex;\n    }) as SqlQuery;\n  }\n}\n\nSqlBase.register(SqlQuery);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE, SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport { SqlQuery } from '../../sql-query/sql-query';\nimport { SqlWithQuery } from '../../sql-with-query/sql-with-query';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nimport type { SqlJoinPart } from './sql-join-part';\n\nexport interface SqlFromClauseValue extends SqlClauseValue {\n  expressions: SeparatedArray<SqlExpression>;\n  joinParts?: SeparatedArray<SqlJoinPart>;\n}\n\nexport class SqlFromClause extends SqlClause {\n  static type: SqlTypeDesignator = 'fromClause';\n\n  static DEFAULT_FROM_KEYWORD = 'FROM';\n\n  static create(expressions: SeparatedArray<SqlExpression> | SqlExpression[]): SqlFromClause {\n    return new SqlFromClause({\n      expressions: SeparatedArray.fromArray(expressions).map(ex =>\n        ex instanceof SqlQuery || ex instanceof SqlWithQuery ? ex.ensureParens() : ex,\n      ),\n    });\n  }\n\n  public readonly expressions: SeparatedArray<SqlExpression>;\n  public readonly joinParts?: SeparatedArray<SqlJoinPart>;\n\n  constructor(options: SqlFromClauseValue) {\n    super(options, SqlFromClause.type);\n    this.expressions = options.expressions;\n    this.joinParts = options.joinParts;\n  }\n\n  public valueOf(): SqlFromClauseValue {\n    const value = super.valueOf() as SqlFromClauseValue;\n    value.expressions = this.expressions;\n    value.joinParts = this.joinParts;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('from', SqlFromClause.DEFAULT_FROM_KEYWORD),\n      this.getSpace('postFrom'),\n    ];\n\n    rawParts.push(this.expressions.toString());\n\n    if (this.joinParts) {\n      rawParts.push(this.getSpace('preJoin', NEWLINE), this.joinParts.toString(NEWLINE));\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeExpressions(expressions: SeparatedArray<SqlExpression> | SqlExpression[]): this {\n    const value = this.valueOf();\n    value.expressions = SeparatedArray.fromArray(expressions);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeJoinParts(joinParts: SeparatedArray<SqlJoinPart> | SqlJoinPart[] | undefined): this {\n    const value = this.valueOf();\n    if (joinParts) {\n      value.joinParts = SeparatedArray.fromArray(joinParts);\n    } else {\n      value.spacing = this.getSpacingWithout('preJoin');\n      delete value.joinParts;\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n    if (!expressions) return;\n    if (expressions !== this.expressions) {\n      ret = ret.changeExpressions(expressions);\n    }\n\n    if (this.joinParts) {\n      const joinParts = SqlBase.walkSeparatedArray(this.joinParts, nextStack, fn, postorder);\n      if (!joinParts) return;\n      if (joinParts !== this.joinParts) {\n        ret = ret.changeJoinParts(joinParts);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n\n    value.expressions = this.expressions.clearSeparators();\n\n    if (this.joinParts) {\n      value.joinParts = this.joinParts.clearSeparators();\n    }\n\n    return SqlBase.fromValue(value);\n  }\n\n  public hasJoin(): boolean {\n    return Boolean(this.joinParts);\n  }\n\n  public getJoins(): readonly SqlJoinPart[] {\n    if (!this.joinParts) return [];\n    return this.joinParts.values;\n  }\n\n  public addJoin(join: SqlJoinPart) {\n    return this.changeJoinParts(\n      this.joinParts ? this.joinParts.append(join) : SeparatedArray.fromSingleValue(join),\n    );\n  }\n\n  public removeAllJoins() {\n    return this.changeJoinParts(undefined);\n  }\n}\n\nSqlBase.register(SqlFromClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEmptyArray } from '../../../utils';\nimport { SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport type SqlGroupByDecorator = 'ROLLUP' | 'CUBE' | 'GROUPING SETS';\n\nexport interface SqlGroupByClauseValue extends SqlClauseValue {\n  decorator?: SqlGroupByDecorator;\n  innerParens?: boolean;\n  expressions?: SeparatedArray<SqlExpression>;\n}\n\nexport class SqlGroupByClause extends SqlClause {\n  static type: SqlTypeDesignator = 'groupByClause';\n\n  static DEFAULT_GROUP_BY_KEYWORD = 'GROUP BY';\n\n  static create(expressions?: SeparatedArray<SqlExpression> | SqlExpression[]): SqlGroupByClause {\n    return new SqlGroupByClause({\n      expressions: SeparatedArray.fromPossiblyEmptyArray(expressions),\n    });\n  }\n\n  public readonly decorator?: SqlGroupByDecorator;\n  public readonly innerParens: boolean;\n  public readonly expressions?: SeparatedArray<SqlExpression>;\n\n  constructor(options: SqlGroupByClauseValue) {\n    super(options, SqlGroupByClause.type);\n    this.decorator = options.decorator;\n    this.innerParens = Boolean(options.innerParens);\n    this.expressions = options.expressions;\n  }\n\n  public valueOf(): SqlGroupByClauseValue {\n    const value = super.valueOf() as SqlGroupByClauseValue;\n    value.decorator = this.decorator;\n    if (this.innerParens) value.innerParens = true;\n    value.expressions = this.expressions;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts = [\n      this.getKeyword('groupBy', SqlGroupByClause.DEFAULT_GROUP_BY_KEYWORD),\n      this.getSpace('postGroupBy'),\n    ];\n\n    if (this.decorator) {\n      rawParts.push(this.getKeyword('decorator', this.decorator), this.getSpace('postDecorator'));\n    }\n\n    const effectiveInnerParens = Boolean(this.innerParens || !this.expressions);\n    if (effectiveInnerParens) {\n      rawParts.push('(', this.getSpace('postLeftParen', ''));\n    }\n\n    if (this.expressions) {\n      rawParts.push(this.expressions.toString(), this.getSpace('postExpressions', ''));\n    }\n\n    if (effectiveInnerParens) {\n      rawParts.push(')');\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeExpressions(\n    expressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    const value = this.valueOf();\n    if (!expressions || isEmptyArray(expressions)) {\n      delete value.expressions;\n      delete value.innerParens;\n    } else {\n      value.expressions = SeparatedArray.fromArray(expressions);\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeInnerParens(innerParens: boolean): this {\n    const value = this.valueOf();\n    if (innerParens) {\n      value.innerParens = true;\n    } else {\n      delete value.innerParens;\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public addExpression(\n    expression: SqlExpression,\n    where: 'start' | 'end' = 'end',\n  ): SqlGroupByClause {\n    const { expressions } = this;\n    return this.changeExpressions(\n      expressions\n        ? expressions.insert(where === 'start' ? 0 : Infinity, expression)\n        : SeparatedArray.fromSingleValue(expression),\n    );\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    if (this.expressions) {\n      const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n      if (!expressions) return;\n      if (expressions !== this.expressions) {\n        ret = ret.changeExpressions(expressions);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    if (!this.expressions) return this;\n    const value = this.valueOf();\n    value.expressions = this.expressions.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  public toArray(): readonly SqlExpression[] {\n    return this.expressions ? this.expressions.values : [];\n  }\n\n  public removeExpression(selectExpression: SqlExpression, selectIndex: number): SqlGroupByClause {\n    if (!this.expressions) return this;\n    return this.changeExpressions(\n      this.expressions.filterMap(expression => {\n        if (expression instanceof SqlLiteral && expression.isIndex()) {\n          const expressionIndex = expression.getIndexValue();\n          if (selectIndex < expressionIndex) {\n            return expression.incrementIndex(-1);\n          } else if (expressionIndex === selectIndex) {\n            return;\n          }\n        }\n        if (expression.equals(selectExpression.getUnderlyingExpression())) return;\n        return expression;\n      }),\n    );\n  }\n\n  public shiftIndexes(aboveIndex: number): SqlGroupByClause {\n    if (!this.expressions) return this;\n    return this.changeExpressions(\n      this.expressions.map(expression => {\n        if (expression instanceof SqlLiteral && expression.isIndex()) {\n          const expressionIndex = expression.getIndexValue();\n          if (aboveIndex <= expressionIndex) {\n            return expression.incrementIndex();\n          }\n        }\n        return expression;\n      }),\n    );\n  }\n}\n\nSqlBase.register(SqlGroupByClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray, Separator } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { DecomposeViaOptions } from '../sql-expression';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\n\nexport type SqlMultiOp = 'AND' | 'OR' | '||' | '+' | '-' | '*' | '/';\n\nconst OP_TO_ZERO: Record<SqlMultiOp, SqlLiteral> = {\n  'AND': SqlLiteral.TRUE,\n  'OR': SqlLiteral.FALSE,\n  '||': SqlLiteral.EMPTY_STRING,\n  '+': SqlLiteral.ZERO_POINT_ZERO,\n  '-': SqlLiteral.ZERO_POINT_ZERO,\n  '*': SqlLiteral.ONE_POINT_ZERO,\n  '/': SqlLiteral.ONE_POINT_ZERO,\n};\n\nexport interface SqlMultiValue extends SqlBaseValue {\n  op: SqlMultiOp;\n  args: SeparatedArray<SqlExpression>;\n}\n\nexport class SqlMulti extends SqlExpression {\n  static type: SqlTypeDesignator = 'multi';\n\n  static create(\n    op: SqlMultiOp,\n    args: SeparatedArray<SqlExpression> | readonly SqlExpression[],\n  ): SqlMulti {\n    return new SqlMulti({\n      op,\n      args: SeparatedArray.fromArray(args),\n    });\n  }\n\n  static createIfNeeded(op: SqlMultiOp, args: readonly SqlExpression[]): SqlExpression {\n    switch (args.length) {\n      case 0:\n        return OP_TO_ZERO[op];\n\n      case 1:\n        return args[0]!;\n\n      default:\n        return SqlMulti.create(op, args);\n    }\n  }\n\n  public readonly op: SqlMultiOp;\n  public readonly args: SeparatedArray<SqlExpression>;\n\n  constructor(options: SqlMultiValue) {\n    super(options, SqlMulti.type);\n\n    this.op = options.op;\n    if (!this.op) throw new Error(`must have op`);\n\n    this.args = options.args;\n    if (!this.args) throw new Error(`must have args`);\n  }\n\n  public valueOf(): SqlMultiValue {\n    const value = super.valueOf() as SqlMultiValue;\n    value.op = this.op;\n    value.args = this.args;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { op, args } = this;\n    const sep = SqlBase.capitalize(op);\n    return args.toString(\n      args.length() > 3 && (op === 'AND' || op === 'OR')\n        ? Separator.newlineFirst(sep)\n        : Separator.symmetricSpace(sep),\n    );\n  }\n\n  public numArgs(): number {\n    return this.args?.length() || 0;\n  }\n\n  public getArgArray(): readonly SqlExpression[] {\n    return this.args?.values || [];\n  }\n\n  public getArg(index: number): SqlExpression | undefined {\n    return this.args?.get(index);\n  }\n\n  public changeArgs(args: SeparatedArray<SqlExpression>): this {\n    const value = this.valueOf();\n    value.args = args;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const args = SqlBase.walkSeparatedArray(this.args, nextStack, fn, postorder);\n    if (!args) return;\n    if (args !== this.args) {\n      ret = ret.changeArgs(args);\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.args = this.args.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  public flatten(flatteningOp?: SqlMultiOp): SqlExpression {\n    const { op, args } = this;\n    if (flatteningOp && op !== flatteningOp) return this;\n    return SqlMulti.create(\n      op,\n      args.values.flatMap(v => v.flatten(op)),\n    );\n  }\n\n  public decomposeViaAnd(options: DecomposeViaOptions = {}): SqlExpression[] {\n    const { op, args } = this;\n    if (op !== 'AND') return super.decomposeViaAnd(options);\n    if (options.flatten) {\n      return args.values.flatMap(v => v.decomposeViaAnd(options));\n    } else {\n      const { preserveParens } = options;\n      if (this.hasParens()) return [preserveParens ? this : this.changeParens([])];\n      return preserveParens ? args.values.slice() : args.values.map(v => v.changeParens([]));\n    }\n  }\n\n  public filterAnd(fn: (ex: SqlExpression) => boolean): SqlExpression | undefined {\n    if (this.op !== 'AND') {\n      return super.filterAnd(fn);\n    }\n\n    const args = this.args.filterMap(a => a.filterAnd(fn));\n    if (!args) return;\n\n    if (args.length() === 1) {\n      return args.first();\n    }\n\n    return this.changeArgs(args);\n  }\n\n  public decomposeViaOr(options: DecomposeViaOptions = {}): SqlExpression[] {\n    const { op, args } = this;\n    if (op !== 'OR') return super.decomposeViaOr(options);\n    if (options.flatten) {\n      return args.values.flatMap(v => v.decomposeViaOr(options));\n    } else {\n      const { preserveParens } = options;\n      if (this.hasParens()) return [preserveParens ? this : this.changeParens([])];\n      return preserveParens ? args.values.slice() : args.values.map(v => v.changeParens([]));\n    }\n  }\n\n  public flattenIfNeeded(flatteningOp: SqlMultiOp): SqlExpression | readonly SqlExpression[] {\n    if (this.op === flatteningOp) {\n      return this.hasParens() ? this : this.getArgArray();\n    } else {\n      return this.ensureParens();\n    }\n  }\n}\n\nSqlBase.register(SqlMulti);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE_INDENT, SPACE } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlExpression } from '../../sql-expression';\nimport { SqlMulti } from '../../sql-multi/sql-multi';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlWhereClauseValue extends SqlClauseValue {\n  expression: SqlExpression;\n}\n\nexport class SqlWhereClause extends SqlClause {\n  static type: SqlTypeDesignator = 'whereClause';\n\n  static DEFAULT_WHERE_KEYWORD = 'WHERE';\n\n  static create(expression: SqlWhereClause | SqlExpression): SqlWhereClause {\n    if (expression instanceof SqlWhereClause) return expression;\n    return new SqlWhereClause({\n      expression: SqlExpression.verify(expression),\n    });\n  }\n\n  static createForFunction(expression: SqlWhereClause | SqlExpression): SqlWhereClause {\n    return SqlWhereClause.create(expression).addParens();\n  }\n\n  public readonly expression: SqlExpression;\n\n  constructor(options: SqlWhereClauseValue) {\n    super(options, SqlWhereClause.type);\n    this.expression = options.expression;\n  }\n\n  public valueOf(): SqlWhereClauseValue {\n    const value = super.valueOf() as SqlWhereClauseValue;\n    value.expression = this.expression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { expression } = this;\n    const indent = expression instanceof SqlMulti && expression.numArgs() >= 3;\n    return [\n      this.getKeyword('where', SqlWhereClause.DEFAULT_WHERE_KEYWORD),\n      this.getSpace('postWhere', indent ? NEWLINE_INDENT : SPACE),\n      expression.toString(),\n    ].join('');\n  }\n\n  public changeExpression(expression: SqlExpression): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expression = this.expression._walkHelper(nextStack, fn, postorder);\n    if (!expression) return;\n    if (expression !== this.expression) {\n      ret = ret.changeExpression(expression);\n    }\n\n    return ret;\n  }\n\n  public removeColumnFromAnd(column: string): SqlWhereClause | undefined {\n    const newExpression = this.expression.removeColumnFromAnd(column);\n    if (!newExpression) return;\n    return this.changeExpression(newExpression);\n  }\n}\n\nSqlBase.register(SqlWhereClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE_INDENT, SPACE } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlExpression } from '../../sql-expression';\nimport { SqlMulti } from '../../sql-multi/sql-multi';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlHavingClauseValue extends SqlClauseValue {\n  expression: SqlExpression;\n}\n\nexport class SqlHavingClause extends SqlClause {\n  static type: SqlTypeDesignator = 'havingClause';\n\n  static DEFAULT_HAVING_KEYWORD = 'HAVING';\n\n  static create(expression: SqlHavingClause | SqlExpression): SqlHavingClause {\n    if (expression instanceof SqlHavingClause) return expression;\n    return new SqlHavingClause({\n      expression: SqlExpression.verify(expression),\n    });\n  }\n\n  public readonly expression: SqlExpression;\n\n  constructor(options: SqlHavingClauseValue) {\n    super(options, SqlHavingClause.type);\n    this.expression = options.expression;\n  }\n\n  public valueOf(): SqlHavingClauseValue {\n    const value = super.valueOf() as SqlHavingClauseValue;\n    value.expression = this.expression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { expression } = this;\n    const indent = expression instanceof SqlMulti && expression.numArgs() >= 3;\n    return [\n      this.getKeyword('having', SqlHavingClause.DEFAULT_HAVING_KEYWORD),\n      this.getSpace('postHaving', indent ? NEWLINE_INDENT : SPACE),\n      expression.toString(),\n    ].join('');\n  }\n\n  public changeExpression(expression: SqlExpression): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expression = this.expression._walkHelper(nextStack, fn, postorder);\n    if (!expression) return;\n    if (expression !== this.expression) {\n      ret = ret.changeExpression(expression);\n    }\n\n    return ret;\n  }\n\n  public removeColumnFromAnd(column: string): SqlHavingClause | undefined {\n    const newExpression = this.expression.removeColumnFromAnd(column);\n    if (!newExpression) return;\n    return this.changeExpression(newExpression);\n  }\n}\n\nSqlBase.register(SqlHavingClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlLimitClauseValue extends SqlClauseValue {\n  limit: SqlLiteral;\n}\n\nexport class SqlLimitClause extends SqlClause {\n  static type: SqlTypeDesignator = 'limitClause';\n\n  static DEFAULT_LIMIT_KEYWORD = 'LIMIT';\n\n  static create(limit: SqlLiteral | number): SqlLimitClause {\n    return new SqlLimitClause({\n      limit: SqlLiteral.create(limit),\n    });\n  }\n\n  public readonly limit: SqlLiteral;\n\n  constructor(options: SqlLimitClauseValue) {\n    super(options, SqlLimitClause.type);\n    this.limit = options.limit;\n  }\n\n  public valueOf(): SqlLimitClauseValue {\n    const value = super.valueOf() as SqlLimitClauseValue;\n    value.limit = this.limit;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('limit', SqlLimitClause.DEFAULT_LIMIT_KEYWORD),\n      this.getSpace('postLimit'),\n      this.limit.toString(),\n    ].join('');\n  }\n\n  public changeLimit(limit: SqlLiteral | number): this {\n    const value = this.valueOf();\n    value.limit = SqlLiteral.create(limit);\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const limit = this.limit._walkHelper(nextStack, fn, postorder);\n    if (!limit) return;\n    if (limit !== this.limit) {\n      ret = ret.changeLimit(limit as SqlLiteral);\n    }\n\n    return ret;\n  }\n\n  public getLimitValue(): number {\n    return this.limit.getNumberValue()!;\n  }\n}\n\nSqlBase.register(SqlLimitClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlOffsetClauseValue extends SqlClauseValue {\n  offset: SqlLiteral;\n}\n\nexport class SqlOffsetClause extends SqlClause {\n  static type: SqlTypeDesignator = 'offsetClause';\n\n  static DEFAULT_OFFSET_KEYWORD = 'OFFSET';\n\n  static create(offset: SqlLiteral | number): SqlOffsetClause {\n    return new SqlOffsetClause({\n      offset: SqlLiteral.create(offset),\n    });\n  }\n\n  public readonly offset: SqlLiteral;\n\n  constructor(options: SqlOffsetClauseValue) {\n    super(options, SqlOffsetClause.type);\n    this.offset = options.offset;\n  }\n\n  public valueOf(): SqlOffsetClauseValue {\n    const value = super.valueOf() as SqlOffsetClauseValue;\n    value.offset = this.offset;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('offset', SqlOffsetClause.DEFAULT_OFFSET_KEYWORD),\n      this.getSpace('postOffset'),\n      this.offset.toString(),\n    ].join('');\n  }\n\n  public changeOffset(offset: SqlLiteral | number): this {\n    const value = this.valueOf();\n    value.offset = SqlLiteral.create(offset);\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const offset = this.offset._walkHelper(nextStack, fn, postorder);\n    if (!offset) return;\n    if (offset !== this.offset) {\n      ret = ret.changeOffset(offset as SqlLiteral);\n    }\n\n    return ret;\n  }\n\n  public getOffsetValue(): number {\n    return this.offset.getNumberValue()!;\n  }\n}\n\nSqlBase.register(SqlOffsetClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport type { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlPartitionedByClauseValue extends SqlClauseValue {\n  expression?: SqlExpression;\n}\n\nexport class SqlPartitionedByClause extends SqlClause {\n  static type: SqlTypeDesignator = 'partitionedByClause';\n\n  static DEFAULT_PARTITIONED_BY_KEYWORD = 'PARTITIONED BY';\n  static DEFAULT_ALL_KEYWORD = 'ALL';\n\n  static create(unit: SqlLiteral | undefined): SqlPartitionedByClause {\n    return new SqlPartitionedByClause({ expression: unit });\n  }\n\n  public readonly expression?: SqlExpression;\n\n  constructor(options: SqlPartitionedByClauseValue) {\n    super(options, SqlPartitionedByClause.type);\n    this.expression = options.expression;\n  }\n\n  public valueOf(): SqlPartitionedByClauseValue {\n    const value = super.valueOf() as SqlPartitionedByClauseValue;\n    value.expression = this.expression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('partitionedBy', SqlPartitionedByClause.DEFAULT_PARTITIONED_BY_KEYWORD),\n      this.getSpace('postPartitionedBy'),\n    ];\n\n    if (this.expression) {\n      rawParts.push(this.expression.toString());\n    } else {\n      rawParts.push(this.getKeyword('all', SqlPartitionedByClause.DEFAULT_ALL_KEYWORD));\n    }\n\n    return rawParts.join('');\n  }\n\n  public changePartitionedBy(expression: SqlExpression | undefined): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    if (this.expression) {\n      const expression = this.expression._walkHelper(nextStack, fn, postorder);\n      if (!expression) return;\n      if (expression !== this.expression) {\n        ret = ret.changePartitionedBy(expression);\n      }\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlPartitionedByClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport { SqlLiteral } from '../../sql-literal/sql-literal';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlClusteredByClauseValue extends SqlClauseValue {\n  expressions: SeparatedArray<SqlExpression>;\n}\n\nexport class SqlClusteredByClause extends SqlClause {\n  static type: SqlTypeDesignator = 'clusteredByClause';\n\n  static DEFAULT_CLUSTERED_BY_KEYWORD = 'CLUSTERED BY';\n\n  static create(\n    expressions: SeparatedArray<SqlExpression> | SqlExpression[],\n  ): SqlClusteredByClause {\n    return new SqlClusteredByClause({\n      expressions: SeparatedArray.fromArray(expressions),\n    });\n  }\n\n  public readonly expressions: SeparatedArray<SqlExpression>;\n\n  constructor(options: SqlClusteredByClauseValue) {\n    super(options, SqlClusteredByClause.type);\n    this.expressions = options.expressions;\n  }\n\n  public valueOf(): SqlClusteredByClauseValue {\n    const value = super.valueOf() as SqlClusteredByClauseValue;\n    value.expressions = this.expressions;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('clusteredBy', SqlClusteredByClause.DEFAULT_CLUSTERED_BY_KEYWORD),\n      this.getSpace('postClusteredBy'),\n      this.expressions.toString(),\n    ].join('');\n  }\n\n  public changeExpressions(expressions: SeparatedArray<SqlExpression> | SqlExpression[]): this {\n    const value = this.valueOf();\n    value.expressions = SeparatedArray.fromArray(expressions);\n    return SqlBase.fromValue(value);\n  }\n\n  public addExpression(\n    expression: SqlExpression,\n    where: 'start' | 'end' = 'end',\n  ): SqlClusteredByClause {\n    const { expressions } = this;\n    return this.changeExpressions(\n      expressions\n        ? expressions.insert(where === 'start' ? 0 : Infinity, expression)\n        : SeparatedArray.fromSingleValue(expression),\n    );\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n    if (!expressions) return;\n    if (expressions !== this.expressions) {\n      ret = ret.changeExpressions(expressions);\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    if (!this.expressions) return this;\n    const value = this.valueOf();\n    value.expressions = this.expressions.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  public toArray(): readonly SqlExpression[] {\n    return this.expressions.values;\n  }\n\n  public shiftIndexes(aboveIndex: number): SqlClusteredByClause {\n    if (!this.expressions) return this;\n    return this.changeExpressions(\n      this.expressions.map(expression => {\n        if (expression instanceof SqlLiteral && expression.isIndex()) {\n          const expressionIndex = expression.getIndexValue();\n          if (aboveIndex <= expressionIndex) {\n            return expression.incrementIndex();\n          }\n        }\n        return expression;\n      }),\n    );\n  }\n}\n\nSqlBase.register(SqlClusteredByClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlQuery, SqlValues } from '../..';\nimport type { SeparatedArray } from '../../helpers';\nimport { RefName } from '../../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlColumnList } from '../../sql-column-list/sql-column-list';\n\nexport interface SqlWithPartValue extends SqlBaseValue {\n  table: RefName;\n  columns?: SqlColumnList;\n  query: SqlQuery | SqlValues;\n}\n\nexport class SqlWithPart extends SqlBase {\n  static type: SqlTypeDesignator = 'withPart';\n\n  static DEFAULT_AS_KEYWORD = 'AS';\n\n  static simple(name: string, query: SqlQuery): SqlWithPart {\n    return new SqlWithPart({\n      table: RefName.create(name),\n      query: query.ensureParens(),\n    });\n  }\n\n  public readonly table: RefName;\n  public readonly columns?: SqlColumnList;\n  public readonly query: SqlQuery | SqlValues;\n\n  constructor(options: SqlWithPartValue) {\n    super(options, SqlWithPart.type);\n    this.table = options.table;\n    this.columns = options.columns;\n    this.query = options.query;\n  }\n\n  public valueOf(): SqlWithPartValue {\n    const value = super.valueOf() as SqlWithPartValue;\n    value.table = this.table;\n    value.columns = this.columns;\n    value.query = this.query;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [this.table.toString(), this.getSpace('postTable')];\n\n    if (this.columns) {\n      rawParts.push(this.columns.toString(), this.getSpace('postColumns'));\n    }\n\n    rawParts.push(\n      this.getKeyword('as', SqlWithPart.DEFAULT_AS_KEYWORD),\n      this.getSpace('postAs'),\n      this.query.toString(),\n    );\n\n    return rawParts.join('');\n  }\n\n  public changeTable(table: RefName): this {\n    const value = this.valueOf();\n    value.table = table;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeColumns(\n    columns: SqlColumnList | SeparatedArray<RefName> | RefName[] | undefined,\n  ): this {\n    const value = this.valueOf();\n    if (!columns) {\n      value.spacing = this.getSpacingWithout('postColumns');\n      delete value.columns;\n    } else if (columns instanceof SqlColumnList) {\n      value.columns = columns;\n    } else {\n      value.columns = this.columns\n        ? this.columns.changeColumns(columns)\n        : SqlColumnList.create(columns);\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeQuery(query: SqlQuery): this {\n    const value = this.valueOf();\n    value.query = query;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const query = this.query._walkHelper(nextStack, fn, postorder);\n    if (!query) return;\n    if (query !== this.query) {\n      ret = ret.changeQuery(query as SqlQuery);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlWithPart);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE, SeparatedArray, SPACE } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nimport type { SqlWithPart } from './sql-with-part';\n\nexport interface SqlWithClauseValue extends SqlClauseValue {\n  withParts: SeparatedArray<SqlWithPart>;\n}\n\nexport class SqlWithClause extends SqlClause {\n  static type: SqlTypeDesignator = 'withClause';\n\n  static DEFAULT_WITH_KEYWORD = 'WITH';\n\n  static create(withParts: SeparatedArray<SqlWithPart> | SqlWithPart[]): SqlWithClause {\n    return new SqlWithClause({\n      withParts: SeparatedArray.fromArray(withParts),\n    });\n  }\n\n  public readonly withParts: SeparatedArray<SqlWithPart>;\n\n  constructor(options: SqlWithClauseValue) {\n    super(options, SqlWithClause.type);\n    this.withParts = options.withParts;\n  }\n\n  public valueOf(): SqlWithClauseValue {\n    const value = super.valueOf() as SqlWithClauseValue;\n    value.withParts = this.withParts;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('with', SqlWithClause.DEFAULT_WITH_KEYWORD),\n      this.getSpace('postWith', this.withParts.length() > 1 ? NEWLINE : SPACE),\n    ];\n\n    rawParts.push(this.withParts.toString(',\\n'));\n\n    return rawParts.join('');\n  }\n\n  public changeWithParts(withParts: SeparatedArray<SqlWithPart> | SqlWithPart[]): this {\n    const value = this.valueOf();\n    value.withParts = SeparatedArray.fromArray(withParts);\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const withParts = SqlBase.walkSeparatedArray(this.withParts, nextStack, fn, postorder);\n    if (!withParts) return;\n    if (withParts !== this.withParts) {\n      ret = ret.changeWithParts(withParts);\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n\n    value.withParts = this.withParts.clearSeparators();\n\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlWithClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NEWLINE } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlColumnList } from '../../sql-column-list/sql-column-list';\nimport { SqlExpression } from '../../sql-expression';\nimport { SqlTable } from '../../sql-table/sql-table';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlInsertClauseValue extends SqlClauseValue {\n  table: SqlExpression;\n  columns?: SqlColumnList;\n  format?: string;\n}\n\nexport class SqlInsertClause extends SqlClause {\n  static type: SqlTypeDesignator = 'insertClause';\n\n  static readonly DEFAULT_INSERT_KEYWORD = 'INSERT';\n  static readonly DEFAULT_INTO_KEYWORD = 'INTO';\n  static readonly DEFAULT_AS_KEYWORD = 'AS';\n\n  static create(table: SqlInsertClause | SqlExpression | string): SqlInsertClause {\n    if (table instanceof SqlInsertClause) return table;\n    if (typeof table === 'string') {\n      table = SqlTable.create(table);\n    }\n    return new SqlInsertClause({\n      table: SqlExpression.verify(table),\n    });\n  }\n\n  public readonly table: SqlExpression;\n  public readonly columns?: SqlColumnList;\n  public readonly format?: string;\n\n  constructor(options: SqlInsertClauseValue) {\n    super(options, SqlInsertClause.type);\n    this.table = options.table;\n    this.columns = options.columns;\n    this.format = options.format;\n  }\n\n  public valueOf(): SqlInsertClauseValue {\n    const value = super.valueOf() as SqlInsertClauseValue;\n    value.table = this.table;\n    value.columns = this.columns;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('insert', SqlInsertClause.DEFAULT_INSERT_KEYWORD),\n      this.getSpace('postInsert'),\n      this.getKeyword('into', SqlInsertClause.DEFAULT_INTO_KEYWORD),\n      this.getSpace('postInto'),\n      this.table.toString(),\n    ];\n\n    if (this.columns) {\n      rawParts.push(this.getSpace('preColumns'), this.columns.toString());\n    }\n\n    if (this.format) {\n      rawParts.push(\n        this.getSpace('preAs', NEWLINE),\n        this.getKeyword('as', SqlInsertClause.DEFAULT_AS_KEYWORD),\n        this.getSpace('preFormat'),\n        this.format,\n      );\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeTable(table: SqlExpression | string): this {\n    const value = this.valueOf();\n    if (typeof table === 'string') {\n      table = SqlTable.create(table);\n    }\n    value.table = table;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const table = this.table._walkHelper(nextStack, fn, postorder);\n    if (!table) return;\n    if (!(table instanceof SqlExpression)) {\n      throw new Error('must return expression');\n    }\n    if (table !== this.table) {\n      ret = ret.changeTable(table);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlInsertClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlColumnList } from '../../sql-column-list/sql-column-list';\nimport { SqlExpression } from '../../sql-expression';\nimport { SqlTable } from '../../sql-table/sql-table';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\nimport { SqlWhereClause } from '../sql-where-clause/sql-where-clause';\n\nexport interface SqlReplaceClauseValue extends SqlClauseValue {\n  table: SqlExpression;\n  columns?: SqlColumnList;\n  whereClause?: SqlWhereClause;\n}\n\nexport class SqlReplaceClause extends SqlClause {\n  static type: SqlTypeDesignator = 'replaceClause';\n\n  static readonly DEFAULT_REPLACE_KEYWORD = 'REPLACE';\n  static readonly DEFAULT_INTO_KEYWORD = 'INTO';\n  static readonly DEFAULT_OVERWRITE_KEYWORD = 'OVERWRITE';\n  static readonly DEFAULT_ALL_KEYWORD = 'ALL';\n\n  static create(\n    table: SqlReplaceClause | SqlExpression | string,\n    where?: SqlWhereClause | SqlExpression,\n  ): SqlReplaceClause {\n    if (table instanceof SqlReplaceClause) return table;\n    if (typeof table === 'string') {\n      table = SqlTable.create(table);\n    }\n\n    let whereClause: SqlWhereClause | undefined;\n    if (where) {\n      whereClause = where instanceof SqlWhereClause ? where : SqlWhereClause.create(where);\n    }\n\n    return new SqlReplaceClause({\n      table: SqlExpression.verify(table),\n      whereClause,\n    });\n  }\n\n  public readonly table: SqlExpression;\n  public readonly columns?: SqlColumnList;\n  public readonly whereClause?: SqlWhereClause;\n\n  constructor(options: SqlReplaceClauseValue) {\n    super(options, SqlReplaceClause.type);\n    this.table = options.table;\n    this.columns = options.columns;\n    this.whereClause = options.whereClause;\n  }\n\n  public valueOf(): SqlReplaceClauseValue {\n    const value = super.valueOf() as SqlReplaceClauseValue;\n    value.table = this.table;\n    value.columns = this.columns;\n    value.whereClause = this.whereClause;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('replace', SqlReplaceClause.DEFAULT_REPLACE_KEYWORD),\n      this.getSpace('postReplace'),\n      this.getKeyword('into', SqlReplaceClause.DEFAULT_INTO_KEYWORD),\n      this.getSpace('postInto'),\n      this.table.toString(),\n    ];\n\n    if (this.columns) {\n      rawParts.push(this.getSpace('preColumns'), this.columns.toString());\n    }\n\n    rawParts.push(\n      this.getSpace('preOverwrite'),\n      this.getKeyword('overwrite', SqlReplaceClause.DEFAULT_OVERWRITE_KEYWORD),\n      this.getSpace('postOverwrite'),\n    );\n\n    if (this.whereClause) {\n      rawParts.push(this.whereClause.toString());\n    } else {\n      rawParts.push(this.getKeyword('all', SqlReplaceClause.DEFAULT_ALL_KEYWORD));\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeTable(table: SqlExpression | string): this {\n    const value = this.valueOf();\n    if (typeof table === 'string') {\n      table = SqlTable.create(table);\n    }\n    value.table = table;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const table = this.table._walkHelper(nextStack, fn, postorder);\n    if (!table) return;\n    if (!(table instanceof SqlExpression)) {\n      throw new Error('must return expression');\n    }\n    if (table !== this.table) {\n      ret = ret.changeTable(table);\n    }\n\n    if (this.whereClause) {\n      const whereClause = this.whereClause._walkHelper(nextStack, fn, postorder);\n      if (!whereClause) return;\n      if (whereClause !== this.whereClause) {\n        ret = ret.changeWhereClause(whereClause as SqlWhereClause);\n      }\n    }\n\n    return ret;\n  }\n\n  public changeWhereClause(whereClause: SqlWhereClause | undefined): this {\n    const value = this.valueOf();\n    if (whereClause) {\n      value.whereClause = whereClause;\n    } else {\n      delete value.whereClause;\n      value.keywords = this.getKeywordsWithout('filter');\n    }\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlReplaceClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport { SqlType } from '../../sql-type/sql-type';\n\nexport interface SqlColumnDeclarationValue extends SqlBaseValue {\n  column: RefName;\n  columnType: SqlType;\n}\n\nexport class SqlColumnDeclaration extends SqlBase {\n  static type: SqlTypeDesignator = 'columnDeclaration';\n\n  static create(column: string, columnType: string | SqlType) {\n    return new SqlColumnDeclaration({\n      column: RefName.create(column),\n      columnType: SqlType.create(columnType),\n    });\n  }\n\n  public readonly column: RefName;\n  public readonly columnType: SqlType;\n\n  constructor(options: SqlColumnDeclarationValue) {\n    super(options, SqlColumnDeclaration.type);\n    this.column = options.column;\n    this.columnType = options.columnType;\n  }\n\n  public valueOf(): SqlColumnDeclarationValue {\n    const value = super.valueOf() as SqlColumnDeclarationValue;\n    value.column = this.column;\n    value.columnType = this.columnType;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [this.column.toString(), this.getSpace('postColumn'), this.columnType].join('');\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlColumnDeclaration | undefined {\n    let ret = this;\n\n    if (this.columnType) {\n      const columnType = this.columnType._walkHelper(nextStack, fn, postorder);\n      if (!columnType) return;\n      if (columnType !== this.columnType) {\n        ret = ret.changeColumnType(columnType as SqlType);\n      }\n    }\n\n    return ret;\n  }\n\n  public getColumnName(): string {\n    return this.column.name;\n  }\n\n  public changeColumn(column: RefName | string): this {\n    const value = this.valueOf();\n    value.column = RefName.create(column);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeColumnType(columnType: SqlType | string): this {\n    const value = this.valueOf();\n    value.columnType = SqlType.create(columnType);\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlColumnDeclaration);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nimport type { SqlColumnDeclaration } from './sql-column-declaration';\n\nexport interface SqlExtendClauseValue extends SqlClauseValue {\n  columnDeclarations: SeparatedArray<SqlColumnDeclaration>;\n}\n\nexport class SqlExtendClause extends SqlClause {\n  static type: SqlTypeDesignator = 'extendClause';\n\n  static DEFAULT_EXTEND_KEYWORD = 'EXTEND';\n\n  static create(columnDeclarations: readonly SqlColumnDeclaration[]): SqlExtendClause {\n    return new SqlExtendClause({\n      columnDeclarations: SeparatedArray.fromArray(columnDeclarations),\n    });\n  }\n\n  public readonly columnDeclarations: SeparatedArray<SqlColumnDeclaration>;\n\n  constructor(options: SqlExtendClauseValue) {\n    super(options, SqlExtendClause.type);\n    this.columnDeclarations = options.columnDeclarations;\n  }\n\n  public valueOf(): SqlExtendClauseValue {\n    const value = super.valueOf() as SqlExtendClauseValue;\n    value.columnDeclarations = this.columnDeclarations;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('extend', SqlExtendClause.DEFAULT_EXTEND_KEYWORD, 'postExtend'),\n      '(',\n      this.getSpace('postLeftParen', ''),\n      this.columnDeclarations.toString(),\n      this.getSpace('postColumnDeclarations', ''),\n      ')',\n    ].join('');\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const columnDeclarations = SqlBase.walkSeparatedArray(\n      this.columnDeclarations,\n      nextStack,\n      fn,\n      postorder,\n    );\n    if (!columnDeclarations) return;\n    if (columnDeclarations !== this.columnDeclarations) {\n      ret = ret.changeColumnDeclarations(columnDeclarations);\n    }\n\n    return ret;\n  }\n\n  public changeColumnDeclarations(\n    columnDeclarations: SeparatedArray<SqlColumnDeclaration> | readonly SqlColumnDeclaration[],\n  ): this {\n    const value = this.valueOf();\n    value.columnDeclarations = SeparatedArray.fromArray(columnDeclarations);\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlExtendClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray } from '../../helpers';\nimport type { SqlTypeDesignator, Substitutor } from '../../sql-base';\nimport { SqlBase } from '../../sql-base';\nimport type { SqlExpression } from '../../sql-expression';\nimport type { SqlClauseValue } from '../sql-clause';\nimport { SqlClause } from '../sql-clause';\n\nexport interface SqlPartitionByClauseValue extends SqlClauseValue {\n  expressions: SeparatedArray<SqlExpression>;\n}\n\nexport class SqlPartitionByClause extends SqlClause {\n  static type: SqlTypeDesignator = 'partitionByClause';\n\n  static DEFAULT_PARTITION_BY_KEYWORD = 'PARTITION BY';\n\n  static create(\n    expressions: SeparatedArray<SqlExpression> | SqlExpression[],\n  ): SqlPartitionByClause {\n    return new SqlPartitionByClause({\n      expressions: SeparatedArray.fromArray(expressions),\n    });\n  }\n\n  public readonly expressions: SeparatedArray<SqlExpression>;\n\n  constructor(options: SqlPartitionByClauseValue) {\n    super(options, SqlPartitionByClause.type);\n    this.expressions = options.expressions;\n  }\n\n  public valueOf(): SqlPartitionByClauseValue {\n    const value = super.valueOf() as SqlPartitionByClauseValue;\n    value.expressions = this.expressions;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('partitionBy', SqlPartitionByClause.DEFAULT_PARTITION_BY_KEYWORD),\n      this.getSpace('postPartitionBy'),\n      this.expressions.toString(),\n    ].join('');\n  }\n\n  public changeExpressions(expressions: SeparatedArray<SqlExpression> | SqlExpression[]): this {\n    const value = this.valueOf();\n    value.expressions = SeparatedArray.fromArray(expressions);\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlClause | undefined {\n    let ret = this;\n\n    const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n    if (!expressions) return;\n    if (expressions !== this.expressions) {\n      ret = ret.changeExpressions(expressions);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlPartitionByClause);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\n\nexport interface SqlKeyValueValue extends SqlBaseValue {\n  key: SqlExpression;\n  value: SqlExpression;\n  short?: boolean;\n}\n\nexport class SqlKeyValue extends SqlExpression {\n  static type: SqlTypeDesignator = 'keyValue';\n\n  static DEFAULT_KEY_KEYWORD = 'KEY';\n  static DEFAULT_VALUE_KEYWORD = 'VALUE';\n\n  static create(\n    key: SqlExpression | LiteralValue,\n    value: SqlExpression | LiteralValue,\n  ): SqlKeyValue {\n    return new SqlKeyValue({\n      key: SqlExpression.wrap(key),\n      value: SqlExpression.wrap(value),\n    });\n  }\n\n  static short(\n    key: SqlExpression | LiteralValue,\n    value: SqlExpression | LiteralValue,\n  ): SqlKeyValue {\n    return new SqlKeyValue({\n      key: SqlExpression.wrap(key),\n      value: SqlExpression.wrap(value),\n      short: true,\n    });\n  }\n\n  public readonly key: SqlExpression;\n  public readonly value: SqlExpression;\n  public readonly short?: boolean;\n\n  constructor(options: SqlKeyValueValue) {\n    super(options, SqlKeyValue.type);\n    this.key = options.key;\n    this.value = options.value;\n    this.short = options.short;\n  }\n\n  public valueOf() {\n    const value = super.valueOf() as SqlKeyValueValue;\n    value.key = this.key;\n    value.value = this.value;\n    value.short = this.short;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    if (this.short) {\n      return [\n        this.key.toString(),\n        this.getSpace('postKeyExpression', ''),\n        ':',\n        this.getSpace('preValueExpression', ''),\n        this.value.toString(),\n      ].join('');\n    } else {\n      return [\n        this.getKeyword('key', SqlKeyValue.DEFAULT_KEY_KEYWORD),\n        this.getSpace('postKey'),\n        this.key.toString(),\n        this.getSpace('postKeyExpression'),\n        this.getKeyword('value', SqlKeyValue.DEFAULT_VALUE_KEYWORD),\n        this.getSpace('preValueExpression'),\n        this.value.toString(),\n      ].join('');\n    }\n  }\n\n  public changeKey(key: SqlExpression): this {\n    const value = this.valueOf();\n    value.key = key;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeValue(value: SqlExpression): this {\n    const val = this.valueOf();\n    val.value = value;\n    return SqlBase.fromValue(val);\n  }\n\n  public changeShort(short: boolean): this {\n    if (Boolean(this.short) === short) return this;\n    const value = this.valueOf();\n    value.spacing = {}; // Reset all spacing\n    if (short) {\n      value.short = true;\n    } else {\n      delete value.short;\n    }\n\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const key = this.key._walkHelper(nextStack, fn, postorder);\n    if (!key) return;\n    if (key !== this.key) {\n      ret = ret.changeKey(key);\n    }\n\n    const value = this.value._walkHelper(nextStack, fn, postorder);\n    if (!value) return;\n    if (value !== this.value) {\n      ret = ret.changeValue(value);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlKeyValue);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\n\nexport interface SqlLabeledExpressionValue extends SqlBaseValue {\n  label: RefName;\n  expression: SqlExpression;\n}\n\nexport class SqlLabeledExpression extends SqlExpression {\n  static type: SqlTypeDesignator = 'labeledExpression';\n\n  static create(\n    label: RefName | string,\n    expression: SqlExpression,\n    forceQuotes?: boolean,\n  ): SqlLabeledExpression {\n    if (expression instanceof SqlLabeledExpression) {\n      return expression.changeLabel(label, forceQuotes);\n    }\n\n    return new SqlLabeledExpression({\n      expression: expression,\n      label: typeof label === 'string' ? RefName.alias(label, forceQuotes) : label,\n    });\n  }\n\n  public readonly label: RefName;\n  public readonly expression: SqlExpression;\n\n  constructor(options: SqlLabeledExpressionValue) {\n    super(options, SqlLabeledExpression.type);\n    this.label = options.label;\n    this.expression = options.expression;\n  }\n\n  public valueOf() {\n    const value = super.valueOf() as SqlLabeledExpressionValue;\n    value.label = this.label;\n    value.expression = this.expression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.label.toString(),\n      this.getSpace('preArrow'),\n      '=>',\n      this.getSpace('postArrow'),\n      this.expression.toString(),\n    ].join('');\n  }\n\n  public changeExpression(expression: SqlExpression): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeLabel(label: string | RefName, forceQuotes = false): this {\n    const newLabel =\n      typeof label === 'string'\n        ? forceQuotes\n          ? RefName.alias(label, forceQuotes)\n          : this.label.changeNameAsAlias(label)\n        : label;\n\n    const value = this.valueOf();\n    value.label = newLabel;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const expression = this.expression._walkHelper(nextStack, fn, postorder);\n    if (!expression) return;\n    if (expression !== this.expression) {\n      ret = ret.changeExpression(expression as any);\n    }\n\n    return ret;\n  }\n\n  public getLabelName(): string {\n    return this.label.name;\n  }\n\n  public getUnderlyingExpression(): SqlExpression {\n    return this.expression;\n  }\n\n  public changeUnderlyingExpression(newExpression: SqlExpression): SqlExpression {\n    return this.changeExpression(newExpression);\n  }\n}\n\nSqlBase.register(SqlLabeledExpression);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cleanFunctionArguments, filterMap, isDate } from '../../utils';\nimport { RefName, SeparatedArray, Separator } from '../helpers';\nimport { SPECIAL_FUNCTIONS } from '../special-functions';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlColumnDeclaration } from '../sql-clause';\nimport { SqlExtendClause, SqlWhereClause } from '../sql-clause';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlKeyValue } from '../sql-key-value/sql-key-value';\nimport { SqlLabeledExpression } from '../sql-labeled-expression/sql-labeled-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\nimport { SqlNamespace } from '../sql-namespace/sql-namespace';\nimport { SqlStar } from '../sql-star/sql-star';\nimport { SqlType } from '../sql-type/sql-type';\nimport type { SqlWindowSpec } from '../sql-window-spec/sql-window-spec';\n\nconst specialFunctionLookup: Record<string, boolean> = {};\nfor (const r of SPECIAL_FUNCTIONS) {\n  specialFunctionLookup[r] = true;\n}\n\nexport type SpecialParen = 'square' | 'none';\n\nexport interface SqlFunctionValue extends SqlBaseValue {\n  namespace?: SqlNamespace;\n  functionName: RefName;\n  specialParen?: SpecialParen;\n  decorator?: string;\n  args?: SeparatedArray<SqlExpression>;\n  whereClause?: SqlWhereClause;\n  extendClause?: SqlExtendClause;\n  windowSpec?: SqlWindowSpec;\n}\n\nexport class SqlFunction extends SqlExpression {\n  static type: SqlTypeDesignator = 'function';\n\n  static DEFAULT_FILTER_KEYWORD = 'FILTER';\n  static DEFAULT_OVER_KEYWORD = 'OVER';\n\n  static COUNT_STAR: SqlFunction;\n\n  static SPECIAL_FUNCTIONS = SPECIAL_FUNCTIONS;\n\n  static isValidFunctionName(functionName: string) {\n    return Boolean(!RefName.isReservedFunctionName(functionName));\n  }\n\n  static isNakedFunction(functionName: string) {\n    return Boolean(specialFunctionLookup[functionName.toUpperCase()]);\n  }\n\n  static simple(\n    functionName: RefName | string,\n    args: (SqlExpression | LiteralValue)[] | SeparatedArray<SqlExpression>,\n    filter?: SqlWhereClause | SqlExpression,\n  ) {\n    return new SqlFunction({\n      functionName: RefName.functionName(functionName),\n      args: SeparatedArray.fromArray(Array.isArray(args) ? args.map(SqlExpression.wrap) : args),\n      whereClause: filter ? SqlWhereClause.createForFunction(filter) : undefined,\n    });\n  }\n\n  static decorated(\n    functionName: RefName | string,\n    decorator: string | undefined,\n    args: (SqlExpression | LiteralValue)[] | SeparatedArray<SqlExpression>,\n    filter?: SqlWhereClause | SqlExpression,\n  ) {\n    return new SqlFunction({\n      functionName: RefName.functionName(functionName),\n      decorator: decorator,\n      args: SeparatedArray.fromArray(Array.isArray(args) ? args.map(SqlExpression.wrap) : args),\n      whereClause: filter ? SqlWhereClause.createForFunction(filter) : undefined,\n    });\n  }\n\n  static count(arg?: SqlExpression) {\n    return SqlFunction.simple('COUNT', [arg || SqlStar.PLAIN]);\n  }\n\n  static countDistinct(arg: SqlExpression) {\n    return SqlFunction.decorated('COUNT', 'DISTINCT', [arg]);\n  }\n\n  static sum(arg: SqlExpression) {\n    return SqlFunction.simple('SUM', [arg]);\n  }\n\n  static min(arg: SqlExpression) {\n    return SqlFunction.simple('MIN', [arg]);\n  }\n\n  static max(arg: SqlExpression) {\n    return SqlFunction.simple('MAX', [arg]);\n  }\n\n  static avg(arg: SqlExpression) {\n    return SqlFunction.simple('AVG', [arg]);\n  }\n\n  static cast(ex: SqlExpression | LiteralValue, asType: SqlType | string): SqlExpression {\n    return new SqlFunction({\n      functionName: RefName.functionName('CAST'),\n      args: SeparatedArray.fromTwoValuesWithSeparator(\n        SqlExpression.wrap(ex),\n        Separator.symmetricSpace('AS'),\n        SqlType.create(asType),\n      ),\n    });\n  }\n\n  static jsonValue(\n    ex: SqlExpression | LiteralValue,\n    path: SqlExpression | string,\n    returningType?: SqlType | string,\n  ): SqlExpression {\n    const args: SqlExpression[] = [SqlExpression.wrap(ex), SqlExpression.wrap(path)];\n    const separators: Separator[] = [Separator.COMMA];\n\n    if (returningType) {\n      args.push(SqlType.create(returningType));\n      separators.push(Separator.symmetricSpace('RETURNING'));\n    }\n\n    return new SqlFunction({\n      functionName: RefName.functionName('JSON_VALUE'),\n      args: new SeparatedArray(args, separators),\n    });\n  }\n\n  static jsonObject(\n    keyValues?: SeparatedArray<SqlKeyValue> | SqlKeyValue[] | SqlKeyValue | Record<string, any>,\n  ): SqlExpression {\n    let args: SeparatedArray<SqlKeyValue> | undefined;\n    if (keyValues instanceof SeparatedArray) {\n      args = keyValues;\n    } else if (Array.isArray(keyValues)) {\n      args = SeparatedArray.fromPossiblyEmptyArray(keyValues);\n    } else if (keyValues instanceof SqlKeyValue) {\n      args = SeparatedArray.fromSingleValue(keyValues);\n    } else if (keyValues && typeof keyValues === 'object') {\n      args = SeparatedArray.fromPossiblyEmptyArray(\n        filterMap(Object.entries(keyValues), ([k, v]) => {\n          let value: SqlExpression | LiteralValue;\n          switch (typeof v) {\n            case 'object':\n              if (!v || v instanceof SqlExpression || isDate(v)) {\n                value = v;\n              } else if (Array.isArray(v)) {\n                value = SqlFunction.array(...v);\n              } else {\n                value = SqlFunction.jsonObject(v);\n              }\n              break;\n\n            case 'undefined':\n              return;\n\n            case 'function':\n            case 'symbol':\n              throw new TypeError(`Cannot use ${typeof v} (in key ${k}) as a JSON object value`);\n\n            case 'string':\n            case 'number':\n            case 'bigint':\n            case 'boolean':\n            default:\n              value = v;\n          }\n          return SqlKeyValue.short(k, value);\n        }),\n      );\n    }\n\n    return new SqlFunction({\n      functionName: RefName.functionName('JSON_OBJECT'),\n      args,\n    });\n  }\n\n  static floor(ex: SqlExpression, timeUnit: string | SqlLiteral): SqlExpression {\n    return new SqlFunction({\n      functionName: RefName.functionName('FLOOR'),\n      args: SeparatedArray.fromTwoValuesWithSeparator(\n        ex,\n        Separator.symmetricSpace('TO'),\n        SqlLiteral.direct(timeUnit),\n      ),\n    });\n  }\n\n  static timeFloor(\n    timestampExpr: SqlExpression,\n    period: string | SqlLiteral,\n    origin?: string | SqlLiteral,\n    timezone?: string | SqlLiteral,\n  ) {\n    return SqlFunction.simple(\n      'TIME_FLOOR',\n      cleanFunctionArguments([timestampExpr, period, origin, timezone]),\n    );\n  }\n\n  static timeCeil(\n    timestampExpr: SqlExpression,\n    period: string | SqlLiteral,\n    origin?: string | SqlLiteral,\n    timezone?: string | SqlLiteral,\n  ) {\n    return SqlFunction.simple(\n      'TIME_CEIL',\n      cleanFunctionArguments([timestampExpr, period, origin, timezone]),\n    );\n  }\n\n  static timeShift(\n    timestampExpr: SqlExpression,\n    period: string | SqlLiteral,\n    step: number | SqlLiteral,\n    timezone?: string | SqlLiteral,\n  ) {\n    return SqlFunction.simple(\n      'TIME_SHIFT',\n      cleanFunctionArguments([timestampExpr, period, step, timezone]),\n    );\n  }\n\n  static array(...exs: (LiteralValue | SqlExpression)[]): SqlExpression {\n    // Back compat to make the old form work\n    if (exs.length === 1 && Array.isArray(exs[0])) exs = exs[0] as any;\n    return new SqlFunction({\n      functionName: RefName.functionName('ARRAY'),\n      specialParen: 'square',\n      args: SeparatedArray.fromPossiblyEmptyArray(exs.map(SqlExpression.wrap)),\n    });\n  }\n\n  static stringFormat(format: string | SqlLiteral, ...args: (SqlExpression | LiteralValue)[]) {\n    return SqlFunction.simple(\n      'STRING_FORMAT',\n      ([format] as (SqlExpression | LiteralValue)[]).concat(args),\n    );\n  }\n\n  static regexpLike(ex: SqlExpression, pattern: string | SqlLiteral) {\n    return SqlFunction.simple('REGEXP_LIKE', [ex, pattern]);\n  }\n\n  public readonly namespace?: SqlNamespace;\n  public readonly functionName: RefName;\n  public readonly specialParen?: SpecialParen;\n  public readonly args?: SeparatedArray<SqlExpression>;\n  public readonly decorator?: string;\n  public readonly whereClause?: SqlWhereClause;\n  public readonly extendClause?: SqlExtendClause;\n  public readonly windowSpec?: SqlWindowSpec;\n\n  constructor(options: SqlFunctionValue) {\n    super(options, SqlFunction.type);\n    this.namespace = options.namespace;\n    this.functionName = options.functionName;\n    this.specialParen = options.specialParen;\n    this.decorator = options.decorator;\n    this.args = options.args;\n    this.whereClause = options.whereClause;\n    this.extendClause = options.extendClause;\n    this.windowSpec = options.windowSpec;\n  }\n\n  public valueOf(): SqlFunctionValue {\n    const value = super.valueOf() as SqlFunctionValue;\n    value.namespace = this.namespace;\n    value.functionName = this.functionName;\n    value.specialParen = this.specialParen;\n    value.decorator = this.decorator;\n    value.args = this.args;\n    value.whereClause = this.whereClause;\n    value.extendClause = this.extendClause;\n    value.windowSpec = this.windowSpec;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { specialParen } = this;\n    const rawParts: string[] = [];\n\n    if (this.namespace) {\n      rawParts.push(\n        this.namespace.toString(),\n        this.getSpace('postNamespace', ''),\n        '.',\n        this.getSpace('postDot', ''),\n      );\n    }\n\n    rawParts.push(this.functionName.toString());\n\n    if (specialParen !== 'none') {\n      rawParts.push(\n        this.getSpace('preLeftParen', ''),\n        specialParen === 'square' ? '[' : '(',\n        this.getSpace('postLeftParen', ''),\n      );\n\n      if (this.decorator) {\n        rawParts.push(this.getKeyword('decorator', this.decorator), this.getSpace('postDecorator'));\n      }\n\n      if (this.args) {\n        rawParts.push(this.args.toString(Separator.COMMA), this.getSpace('postArguments', ''));\n      }\n\n      rawParts.push(specialParen === 'square' ? ']' : ')');\n\n      if (this.whereClause) {\n        rawParts.push(\n          this.getSpace('preFilter'),\n          this.getKeyword('filter', SqlFunction.DEFAULT_FILTER_KEYWORD),\n          this.getSpace('postFilter'),\n          this.whereClause.toString(),\n        );\n      } else if (this.extendClause) {\n        rawParts.push(this.getSpace('preExtend'), this.extendClause.toString());\n      }\n\n      if (this.windowSpec) {\n        rawParts.push(\n          this.getSpace('preOver'),\n          this.getKeyword('over', SqlFunction.DEFAULT_OVER_KEYWORD),\n          this.getSpace('postOver'),\n          this.windowSpec.toString(),\n        );\n      }\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeNamespace(namespace: SqlNamespace | undefined): this {\n    const value = this.valueOf();\n    if (namespace) {\n      value.namespace = namespace;\n    } else {\n      delete value.namespace;\n      value.spacing = this.getSpacingWithout('postNamespace', 'postDot');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public getNamespaceName(): string | undefined {\n    return this.namespace?.getName();\n  }\n\n  public changeNamespaceName(namespace: string | undefined): this {\n    return this.changeNamespace(\n      namespace\n        ? this.namespace\n          ? this.namespace.changeName(namespace)\n          : SqlNamespace.create(namespace)\n        : undefined,\n    );\n  }\n\n  public getEffectiveFunctionName(): string {\n    return this.functionName.name.toUpperCase();\n  }\n\n  public getEffectiveDecorator(): string | undefined {\n    return this.decorator?.toUpperCase();\n  }\n\n  public changeArgs(args: SeparatedArray<SqlExpression>): this {\n    const value = this.valueOf();\n    value.args = args;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeArg(index: number, arg: SqlExpression): this {\n    const { args } = this;\n    if (!args) return this;\n    return this.changeArgs(args.change(index, arg));\n  }\n\n  public numArgs(): number {\n    const { args } = this;\n    if (!args) return 0;\n    return args.length();\n  }\n\n  public numPositionalArgs(): number {\n    const { args } = this;\n    if (!args) return 0;\n    return args.values.filter(ex => !(ex instanceof SqlLabeledExpression)).length;\n  }\n\n  public numLabeledArgs(): number {\n    const { args } = this;\n    if (!args) return 0;\n    return args.values.filter(ex => ex instanceof SqlLabeledExpression).length;\n  }\n\n  public getArgArray(): readonly SqlExpression[] {\n    return this.args?.values || [];\n  }\n\n  public getArg(indexOrLabel: number | string): SqlExpression | undefined {\n    const { args } = this;\n    if (!args) return;\n    if (typeof indexOrLabel === 'number') {\n      return args.get(indexOrLabel);\n    } else {\n      return filterMap(args.values, ex =>\n        ex instanceof SqlLabeledExpression && ex.getLabelName() === indexOrLabel\n          ? ex.expression\n          : undefined,\n      )[0];\n    }\n  }\n\n  public getArgAsString(indexOrLabel: number | string): string | undefined {\n    const arg = this.getArg(indexOrLabel);\n    if (!(arg instanceof SqlLiteral)) return;\n    return arg.getStringValue();\n  }\n\n  public getArgAsNumber(indexOrLabel: number | string): number | undefined {\n    const arg = this.getArg(indexOrLabel);\n    if (!(arg instanceof SqlLiteral)) return;\n    return arg.getNumberValue();\n  }\n\n  public getArgAsNumberOrBigint(indexOrLabel: number | string): number | bigint | undefined {\n    const arg = this.getArg(indexOrLabel);\n    if (!(arg instanceof SqlLiteral)) return;\n    return arg.getNumberOrBigintValue();\n  }\n\n  public changeWhereClause(whereClause: SqlWhereClause | undefined): this {\n    const value = this.valueOf();\n    if (whereClause) {\n      value.whereClause = whereClause;\n    } else {\n      delete value.whereClause;\n      value.keywords = this.getKeywordsWithout('filter');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWhereExpression(whereExpression: SqlExpression | undefined): this {\n    if (whereExpression === this.whereClause?.expression) return this;\n    if (!whereExpression || SqlLiteral.isTrue(whereExpression)) {\n      return this.changeWhereClause(undefined);\n    }\n    return this.changeWhereClause(\n      this.whereClause\n        ? this.whereClause.changeExpression(whereExpression)\n        : SqlWhereClause.createForFunction(whereExpression),\n    );\n  }\n\n  public addWhere(...ex: SqlExpression[]) {\n    if (!ex.length) return this;\n    return this.changeWhereExpression(SqlExpression.and(this.getWhereExpression(), ...ex));\n  }\n\n  /**\n   * @description use addWhere instead\n   */\n  public addWhereExpression(whereExpression: SqlExpression): this {\n    return this.addWhere(whereExpression);\n  }\n\n  public getWhereExpression(): SqlExpression | undefined {\n    return this.whereClause?.expression;\n  }\n\n  public getEffectiveWhereExpression(): SqlExpression {\n    return this.getWhereExpression() || SqlLiteral.TRUE;\n  }\n\n  public changeExtendClause(extendClause: SqlExtendClause | undefined): this {\n    const value = this.valueOf();\n    if (extendClause) {\n      value.extendClause = extendClause;\n    } else {\n      delete value.extendClause;\n      value.spacing = this.getSpacingWithout('preExtend');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public isAggregation(knownAggregations: string[]): boolean {\n    return Boolean(this.whereClause || knownAggregations.includes(this.getEffectiveFunctionName()));\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    if (this.args) {\n      const args = SqlBase.walkSeparatedArray(this.args, nextStack, fn, postorder);\n      if (!args) return;\n      if (args !== this.args) {\n        ret = ret.changeArgs(args);\n      }\n    }\n\n    if (this.whereClause) {\n      const whereClause = this.whereClause._walkHelper(nextStack, fn, postorder);\n      if (!whereClause) return;\n      if (whereClause !== this.whereClause) {\n        ret = ret.changeWhereClause(whereClause as SqlWhereClause);\n      }\n    }\n\n    if (this.extendClause) {\n      const extendClause = this.extendClause._walkHelper(nextStack, fn, postorder);\n      if (!extendClause) return;\n      if (extendClause !== this.extendClause) {\n        ret = ret.changeExtendClause(extendClause as SqlExtendClause);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    if (!this.args) return this;\n    const value = this.valueOf();\n    value.args = this.args.clearSeparatorsMatching(',');\n    return SqlBase.fromValue(value);\n  }\n\n  public resetOwnKeywords() {\n    const upperCaseName = this.getEffectiveFunctionName();\n    if (Object.keys(this.keywords).length === 0 && upperCaseName === this.functionName.name) {\n      return this;\n    }\n    const value = this.valueOf();\n    value.functionName = value.functionName.changeNameAsFunctionName(upperCaseName);\n    value.keywords = {};\n    return SqlBase.fromValue(value);\n  }\n\n  public isCountStar(): boolean {\n    if (this.getEffectiveFunctionName() !== 'COUNT') return false;\n    const args = this.args;\n    if (!args || args.length() !== 1) return false;\n    return args.first() instanceof SqlStar;\n  }\n\n  public getCastType(): SqlType | undefined {\n    if (this.getEffectiveFunctionName() !== 'CAST') return;\n    const arg1 = this.args?.get(1);\n    return arg1 instanceof SqlType ? arg1 : undefined;\n  }\n\n  public getColumnDeclarations(): readonly SqlColumnDeclaration[] | undefined {\n    return this.extendClause?.columnDeclarations?.values;\n  }\n\n  public changeColumnDeclarations(\n    columnDeclarations: readonly SqlColumnDeclaration[] | undefined,\n  ): this {\n    if (!columnDeclarations) return this.changeExtendClause(undefined);\n    return this.changeExtendClause(\n      this.extendClause\n        ? this.extendClause.changeColumnDeclarations(columnDeclarations)\n        : SqlExtendClause.create(columnDeclarations),\n    );\n  }\n}\n\nSqlBase.register(SqlFunction);\n\nSqlFunction.COUNT_STAR = SqlFunction.simple('COUNT', [SqlStar.PLAIN]);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport { SqlFunction } from '../sql-function/sql-function';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\nimport { SqlTable } from '../sql-table/sql-table';\n\nexport interface SqlNamespaceValue extends SqlBaseValue {\n  refName: RefName;\n}\n\nexport class SqlNamespace extends SqlExpression {\n  static type: SqlTypeDesignator = 'namespace';\n\n  static create(name: string | SqlNamespace) {\n    if (name instanceof SqlNamespace) return name;\n    return new SqlNamespace({\n      refName: RefName.create(name),\n    });\n  }\n\n  static optionalQuotes(name: string | SqlNamespace) {\n    if (name instanceof SqlNamespace) return name;\n    return new SqlNamespace({\n      refName: RefName.create(name, false),\n    });\n  }\n\n  public readonly refName: RefName;\n\n  constructor(options: SqlNamespaceValue) {\n    super(options, SqlNamespace.type);\n    this.refName = options.refName;\n  }\n\n  public valueOf(): SqlNamespaceValue {\n    const value = super.valueOf() as SqlNamespaceValue;\n    value.refName = this.refName;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { refName } = this;\n    return refName.toString();\n  }\n\n  public changeRefName(refName: RefName): this {\n    const value = this.valueOf();\n    value.refName = refName;\n    return SqlBase.fromValue(value);\n  }\n\n  public getName(): string {\n    return this.refName.name;\n  }\n\n  public changeName(name: string): this {\n    const { refName } = this;\n    const value = this.valueOf();\n    value.refName = refName.changeName(name);\n    return SqlBase.fromValue(value);\n  }\n\n  public prettyTrim(maxLength: number): this {\n    return this.changeRefName(this.refName.prettyTrim(maxLength));\n  }\n\n  public table(name: string): SqlTable {\n    return SqlTable.create(name, this);\n  }\n\n  public tableWithOptionalQuotes(name: string): SqlTable {\n    return SqlTable.optionalQuotes(name, this);\n  }\n\n  public F(name: string, ...args: (SqlExpression | LiteralValue)[]) {\n    return SqlFunction.simple(name, args).changeNamespace(this);\n  }\n}\n\nSqlBase.register(SqlNamespace);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\n\nexport type SqlUnaryOp = 'NOT' | '+' | '-';\n\nexport interface UnaryExpressionValue extends SqlBaseValue {\n  op: SqlUnaryOp;\n  argument: SqlExpression;\n}\n\nexport class SqlUnary extends SqlExpression {\n  static type: SqlTypeDesignator = 'unary';\n\n  static not(ex: SqlExpression): SqlUnary {\n    return new SqlUnary({\n      op: 'NOT',\n      argument: ex.type === 'multi' || ex.type === 'comparison' ? ex.ensureParens() : ex,\n    });\n  }\n\n  public readonly op: SqlUnaryOp;\n  public readonly argument: SqlExpression;\n\n  constructor(options: UnaryExpressionValue) {\n    super(options, SqlUnary.type);\n    this.op = options.op;\n    this.argument = options.argument;\n  }\n\n  public valueOf(): UnaryExpressionValue {\n    const value = super.valueOf() as UnaryExpressionValue;\n    value.op = this.op;\n    value.argument = this.argument;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [this.getKeyword('op', this.op), this.getSpace('postOp'), this.argument.toString()].join(\n      '',\n    );\n  }\n\n  public changeArgument(argument: SqlExpression): this {\n    const value = this.valueOf();\n    value.argument = argument;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const argument = this.argument._walkHelper(nextStack, fn, postorder);\n    if (!argument) return;\n    if (argument !== this.argument) {\n      ret = ret.changeArgument(argument);\n    }\n\n    return ret;\n  }\n\n  public negate(): SqlExpression {\n    return this.argument;\n  }\n}\n\nSqlBase.register(SqlUnary);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlExpression } from '../sql-expression';\n\nexport interface SqlBetweenPartValue extends SqlBaseValue {\n  symmetric?: boolean;\n  start: SqlExpression;\n  end: SqlExpression;\n}\n\nexport class SqlBetweenPart extends SqlBase {\n  static type: SqlTypeDesignator = 'betweenPart';\n\n  static DEFAULT_SYMMETRIC_KEYWORD = 'SYMMETRIC';\n  static DEFAULT_AND_KEYWORD = 'AND';\n\n  static create(start: SqlExpression, end: SqlExpression): SqlBetweenPart {\n    return new SqlBetweenPart({\n      start,\n      end,\n    });\n  }\n\n  static symmetric(start: SqlExpression, end: SqlExpression): SqlBetweenPart {\n    return new SqlBetweenPart({\n      symmetric: true,\n      start,\n      end,\n    });\n  }\n\n  public readonly symmetric?: boolean;\n  public readonly start: SqlExpression;\n  public readonly end: SqlExpression;\n\n  constructor(options: SqlBetweenPartValue) {\n    super(options, SqlBetweenPart.type);\n    this.symmetric = options.symmetric;\n    this.start = options.start;\n    this.end = options.end;\n  }\n\n  public valueOf(): SqlBetweenPartValue {\n    const value = super.valueOf() as SqlBetweenPartValue;\n    if (this.symmetric) value.symmetric = true;\n    value.start = this.start;\n    value.end = this.end;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [];\n\n    if (this.symmetric) {\n      rawParts.push(\n        this.getKeyword('symmetric', SqlBetweenPart.DEFAULT_SYMMETRIC_KEYWORD),\n        this.getSpace('postSymmetric'),\n      );\n    }\n\n    rawParts.push(\n      this.start.toString(),\n      this.getSpace('preAnd'),\n      this.getKeyword('and', SqlBetweenPart.DEFAULT_AND_KEYWORD),\n      this.getSpace('postAnd'),\n      this.end.toString(),\n    );\n\n    return rawParts.join('');\n  }\n\n  public changeStart(start: SqlExpression): this {\n    const value = this.valueOf();\n    value.start = start;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeEnd(end: SqlExpression): this {\n    const value = this.valueOf();\n    value.end = end;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const start = ret.start._walkHelper(nextStack, fn, postorder);\n    if (!start) return;\n    if (start !== ret.start) {\n      ret = ret.changeStart(start);\n    }\n\n    const end = ret.end._walkHelper(nextStack, fn, postorder);\n    if (!end) return;\n    if (end !== ret.end) {\n      ret = ret.changeEnd(end);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlBetweenPart);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlExpression } from '../sql-expression';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\n\nexport interface SqlLikePartValue extends SqlBaseValue {\n  like: SqlExpression;\n  escape: SqlExpression;\n}\n\nexport class SqlLikePart extends SqlBase {\n  static type: SqlTypeDesignator = 'likePart';\n\n  static DEFAULT_ESCAPE_KEYWORD = 'ESCAPE';\n\n  static create(like: SqlExpression | string, escape: SqlExpression | string): SqlLikePart {\n    const likeEx: SqlExpression = typeof like === 'string' ? SqlLiteral.create(like) : like;\n    const escapeEx: SqlExpression = typeof escape === 'string' ? SqlLiteral.create(escape) : escape;\n    return new SqlLikePart({\n      like: likeEx,\n      escape: escapeEx,\n    });\n  }\n\n  public readonly like: SqlExpression;\n  public readonly escape: SqlExpression;\n\n  constructor(options: SqlLikePartValue) {\n    super(options, SqlLikePart.type);\n    this.like = options.like;\n    this.escape = options.escape;\n  }\n\n  public valueOf(): SqlLikePartValue {\n    const value = super.valueOf() as SqlLikePartValue;\n    value.like = this.like;\n    value.escape = this.escape;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.like.toString(),\n      this.getSpace('preEscape'),\n      this.getKeyword('escape', SqlLikePart.DEFAULT_ESCAPE_KEYWORD),\n      this.getSpace('postEscape'),\n      this.escape.toString(),\n    ];\n\n    return rawParts.join('');\n  }\n\n  public changeLike(like: SqlLiteral): this {\n    const value = this.valueOf();\n    value.like = like;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeEscape(escape: SqlLiteral): this {\n    const value = this.valueOf();\n    value.escape = escape;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const like = ret.like._walkHelper(nextStack, fn, postorder);\n    if (!like) return;\n    if (like !== ret.like) {\n      ret = ret.changeLike(like as SqlLiteral);\n    }\n\n    const escape = ret.escape._walkHelper(nextStack, fn, postorder);\n    if (!escape) return;\n    if (escape !== ret.escape) {\n      ret = ret.changeEscape(escape as SqlLiteral);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlLikePart);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEmptyArray } from '../../utils';\nimport { SeparatedArray, Separator } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\n\nexport interface SqlRecordValue extends SqlBaseValue {\n  expressions?: SeparatedArray<SqlExpression>;\n}\n\nexport class SqlRecord extends SqlExpression {\n  static type: SqlTypeDesignator = 'record';\n\n  static DEFAULT_ROW_KEYWORD = 'ROW';\n\n  static create(\n    expressions?: SqlRecord | SeparatedArray<SqlExpression> | SqlExpression[],\n  ): SqlRecord {\n    if (expressions instanceof SqlRecord) return expressions;\n    const array = SeparatedArray.fromPossiblyEmptyArray(expressions, Separator.COMMA);\n\n    return new SqlRecord({\n      keywords: {\n        row: array && array.length() === 1 ? SqlRecord.DEFAULT_ROW_KEYWORD : '',\n      },\n      expressions: array,\n    });\n  }\n\n  static createWithoutKeyword(\n    expressions?: SqlRecord | SeparatedArray<SqlExpression> | SqlExpression[],\n  ): SqlRecord {\n    if (expressions instanceof SqlRecord) return expressions;\n    return new SqlRecord({\n      expressions: SeparatedArray.fromPossiblyEmptyArray(expressions, Separator.COMMA),\n    });\n  }\n\n  public readonly expressions?: SeparatedArray<SqlExpression>;\n\n  constructor(options: SqlRecordValue) {\n    super(options, SqlRecord.type);\n    this.expressions = options.expressions;\n  }\n\n  public valueOf(): SqlRecordValue {\n    const value = super.valueOf() as SqlRecordValue;\n    value.expressions = this.expressions;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [this.getKeyword('row', '', 'postRow', '')];\n\n    rawParts.push('(', this.getSpace('postLeftParen', ''));\n\n    if (this.expressions) {\n      rawParts.push(\n        this.expressions.toString(Separator.COMMA),\n        this.getSpace('postExpressions', ''),\n      );\n    }\n\n    rawParts.push(')');\n\n    return rawParts.join('');\n  }\n\n  public changeExpressions(\n    expressions: SeparatedArray<SqlExpression> | SqlExpression[] | undefined,\n  ): this {\n    const value = this.valueOf();\n    if (!expressions || isEmptyArray(expressions)) {\n      delete value.expressions;\n    } else {\n      value.expressions = SeparatedArray.fromArray(expressions);\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    if (this.expressions) {\n      const expressions = SqlBase.walkSeparatedArray(this.expressions, nextStack, fn, postorder);\n      if (!expressions) return;\n      if (expressions !== this.expressions) {\n        ret = ret.changeExpressions(expressions);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    if (!this.expressions) return this;\n    const value = this.valueOf();\n    value.expressions = this.expressions.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n\n  public prepend(expression: SqlExpression | LiteralValue): SqlRecord {\n    const { expressions } = this;\n    const ex = SqlExpression.wrap(expression);\n    return this.changeExpressions(\n      expressions ? expressions.prepend(ex) : SeparatedArray.fromSingleValue(ex),\n    );\n  }\n\n  public append(expression: SqlExpression | LiteralValue): SqlRecord {\n    const { expressions } = this;\n    const ex = SqlExpression.wrap(expression);\n    return this.changeExpressions(\n      expressions ? expressions.append(ex) : SeparatedArray.fromSingleValue(ex),\n    );\n  }\n\n  public unwrapIfSingleton(): SqlExpression {\n    const { expressions } = this;\n    if (expressions?.length() !== 1 || this.keywords.row) return this;\n    return expressions\n      .get(0)!\n      .addParens(this.getSpace('postLeftParen', ''), this.getSpace('postExpressions', ''));\n  }\n}\n\nSqlBase.register(SqlRecord);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\nimport { SqlLiteral } from '../sql-literal/sql-literal';\nimport { SqlRecord } from '../sql-record/sql-record';\n\nimport { SqlBetweenPart } from './sql-between-part';\nimport { SqlLikePart } from './sql-like-part';\n\nexport type SqlComparisonOp =\n  | '='\n  | '<>'\n  | '<'\n  | '>'\n  | '<='\n  | '>='\n  | 'IS'\n  | 'IS NOT'\n  | 'IS DISTINCT FROM'\n  | 'IS NOT DISTINCT FROM'\n  | 'IN'\n  | 'NOT IN'\n  | 'LIKE'\n  | 'NOT LIKE'\n  | 'BETWEEN'\n  | 'NOT BETWEEN';\nexport type SqlComparisonDecorator = 'ALL' | 'ANY';\nexport type SpecialLikeType = 'includes' | 'prefix' | 'postfix' | 'exact';\n\nconst ANTI_OP: Record<SqlComparisonOp, SqlComparisonOp> = {\n  '=': '<>',\n  '<>': '=',\n  '<': '>=',\n  '>': '<=',\n  '<=': '>',\n  '>=': '<',\n  'IS': 'IS NOT',\n  'IS NOT': 'IS',\n  'IS DISTINCT FROM': 'IS NOT DISTINCT FROM',\n  'IS NOT DISTINCT FROM': 'IS DISTINCT FROM',\n  'IN': 'NOT IN',\n  'NOT IN': 'IN',\n  'LIKE': 'NOT LIKE',\n  'NOT LIKE': 'LIKE',\n  'BETWEEN': 'NOT BETWEEN',\n  'NOT BETWEEN': 'BETWEEN',\n};\n\nexport interface SqlComparisonValue extends SqlBaseValue {\n  op: SqlComparisonOp;\n  negated?: boolean;\n  lhs: SqlExpression;\n  decorator?: SqlComparisonDecorator;\n  rhs: SqlBase;\n}\n\nexport class SqlComparison extends SqlExpression {\n  static type: SqlTypeDesignator = 'comparison';\n\n  static equal(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '=',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static unequal(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '<>',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static lessThan(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '<',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static greaterThan(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '>',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static lessThanOrEqual(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '<=',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static greaterThanOrEqual(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: '>=',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static isNull(lhs: SqlExpression | LiteralValue): SqlComparison {\n    return new SqlComparison({\n      op: 'IS',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlLiteral.NULL,\n    });\n  }\n\n  static isNotNull(lhs: SqlExpression | LiteralValue): SqlComparison {\n    return SqlComparison.isNull(lhs).negate();\n  }\n\n  static isNotDistinctFrom(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: 'IS NOT DISTINCT FROM',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static isDistinctFrom(\n    lhs: SqlExpression | LiteralValue,\n    rhs: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: 'IS DISTINCT FROM',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlExpression.wrap(rhs),\n    });\n  }\n\n  static in(lhs: SqlExpression, values: (SqlExpression | LiteralValue)[]): SqlComparison {\n    return new SqlComparison({\n      op: 'IN',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlRecord.createWithoutKeyword(values.map(v => SqlExpression.wrap(v))),\n    });\n  }\n\n  static notIn(lhs: SqlExpression, values: (SqlExpression | LiteralValue)[]): SqlComparison {\n    return SqlComparison.in(lhs, values).negate();\n  }\n\n  static like(\n    lhs: SqlExpression | string,\n    rhs: SqlExpression | string,\n    escape?: SqlExpression | string,\n  ): SqlComparison {\n    const rhsEx = SqlExpression.wrap(rhs);\n    return new SqlComparison({\n      op: 'LIKE',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: typeof escape === 'undefined' ? rhsEx : SqlLikePart.create(rhsEx, escape),\n    });\n  }\n\n  static notLike(\n    lhs: SqlExpression,\n    rhs: SqlExpression | string,\n    escape?: SqlExpression | string,\n  ): SqlComparison {\n    return SqlComparison.like(lhs, rhs, escape).negate();\n  }\n\n  static between(\n    lhs: SqlExpression | LiteralValue,\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: 'BETWEEN',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlBetweenPart.create(SqlExpression.wrap(start), SqlExpression.wrap(end)),\n    });\n  }\n\n  static notBetween(\n    lhs: SqlExpression | LiteralValue,\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.between(lhs, start, end).negate();\n  }\n\n  static betweenSymmetric(\n    lhs: SqlExpression | LiteralValue,\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return new SqlComparison({\n      op: 'BETWEEN',\n      lhs: SqlExpression.wrap(lhs),\n      rhs: SqlBetweenPart.symmetric(SqlExpression.wrap(start), SqlExpression.wrap(end)),\n    });\n  }\n\n  static notBetweenSymmetric(\n    lhs: SqlExpression | LiteralValue,\n    start: SqlExpression | LiteralValue,\n    end: SqlExpression | LiteralValue,\n  ): SqlComparison {\n    return SqlComparison.betweenSymmetric(lhs, start, end).negate();\n  }\n\n  static reverseOperator(operator: SqlComparisonOp) {\n    return ANTI_OP[operator];\n  }\n\n  public readonly op: SqlComparisonOp;\n  public readonly lhs: SqlExpression;\n  public readonly decorator?: SqlComparisonDecorator;\n  public readonly rhs: SqlBase;\n\n  constructor(options: SqlComparisonValue) {\n    super(options, SqlComparison.type);\n    this.op = options.op;\n    this.lhs = options.lhs;\n    this.decorator = options.decorator;\n    this.rhs = options.rhs;\n  }\n\n  public valueOf(): SqlComparisonValue {\n    const value = super.valueOf() as SqlComparisonValue;\n    value.op = this.op;\n    value.lhs = this.lhs;\n    value.decorator = this.decorator;\n    value.rhs = this.rhs;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { lhs, op, decorator, rhs } = this;\n\n    const rawParts: string[] = [\n      lhs.toString(),\n      this.getSpace('preOp'),\n      this.getKeyword('op', op),\n      this.getSpace('postOp'),\n    ];\n\n    if (decorator) {\n      rawParts.push(this.getKeyword('decorator', decorator), this.getSpace('postDecorator'));\n    }\n\n    rawParts.push(rhs.toString());\n\n    return rawParts.join('');\n  }\n\n  public changeLhs(lhs: SqlExpression): this {\n    const value = this.valueOf();\n    value.lhs = lhs;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeRhs(rhs: SqlBase): this {\n    const value = this.valueOf();\n    value.rhs = rhs;\n    return SqlBase.fromValue(value);\n  }\n\n  public negate(): this {\n    const { op, decorator } = this;\n\n    const value = this.valueOf();\n    value.op = SqlComparison.reverseOperator(op);\n    value.keywords = this.getKeywordsWithout('op');\n    if (decorator) {\n      value.decorator = decorator === 'ALL' ? 'ANY' : 'ALL';\n    }\n\n    return SqlBase.fromValue(value);\n  }\n\n  public hasNot(): boolean {\n    return this.op.includes('NOT');\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const lhs = this.lhs._walkHelper(nextStack, fn, postorder);\n    if (!lhs) return;\n    if (lhs !== this.lhs) {\n      ret = ret.changeLhs(lhs);\n    }\n\n    const rhs = this.rhs._walkHelper(nextStack, fn, postorder);\n    if (!rhs) return;\n    if (rhs !== this.rhs) {\n      ret = ret.changeRhs(rhs);\n    }\n\n    return ret;\n  }\n\n  public getLikeMatchPattern(): string | undefined {\n    const { op, rhs } = this;\n    if (op !== 'LIKE') return;\n    if (rhs instanceof SqlLiteral) {\n      return rhs.getStringValue();\n    } else if (rhs instanceof SqlLikePart && rhs.like instanceof SqlLiteral) {\n      return rhs.like.getStringValue();\n    }\n    return;\n  }\n\n  public getSpecialLikeType(): SpecialLikeType | undefined {\n    const likeMatchPattern = this.getLikeMatchPattern();\n    if (typeof likeMatchPattern !== 'string') return;\n    if (likeMatchPattern.endsWith('%')) {\n      if (likeMatchPattern.startsWith('%')) {\n        return 'includes'; // %blah%\n      } else {\n        return 'prefix'; // blah%\n      }\n    } else if (likeMatchPattern.startsWith('%')) {\n      return 'postfix'; // %blah\n    } else {\n      return 'exact'; // blah\n    }\n  }\n}\n\nSqlBase.register(SqlComparison);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray, Separator } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\n\nexport interface SqlWhenThenPartValue extends SqlBaseValue {\n  whenExpressions: SeparatedArray<SqlExpression>;\n  thenExpression: SqlExpression;\n}\n\nexport class SqlWhenThenPart extends SqlBase {\n  static type: SqlTypeDesignator = 'whenThenPart';\n\n  static DEFAULT_WHEN_KEYWORD = 'WHEN';\n  static DEFAULT_THEN_KEYWORD = 'THEN';\n\n  static create(\n    whenExpressions: SeparatedArray<SqlExpression> | SqlExpression[] | SqlExpression,\n    thenExpression: SqlExpression | LiteralValue,\n  ): SqlWhenThenPart {\n    return new SqlWhenThenPart({\n      whenExpressions: SeparatedArray.fromArray(\n        whenExpressions instanceof SqlExpression ? [whenExpressions] : whenExpressions,\n      ),\n      thenExpression: SqlExpression.wrap(thenExpression),\n    });\n  }\n\n  public readonly whenExpressions: SeparatedArray<SqlExpression>;\n  public readonly thenExpression: SqlExpression;\n\n  constructor(options: SqlWhenThenPartValue) {\n    super(options, SqlWhenThenPart.type);\n    this.whenExpressions = options.whenExpressions;\n    this.thenExpression = options.thenExpression;\n  }\n\n  public valueOf(): SqlWhenThenPartValue {\n    const value = super.valueOf() as SqlWhenThenPartValue;\n    value.whenExpressions = this.whenExpressions;\n    value.thenExpression = this.thenExpression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    return [\n      this.getKeyword('when', SqlWhenThenPart.DEFAULT_WHEN_KEYWORD),\n      this.getSpace('postWhen'),\n      this.whenExpressions.toString(Separator.COMMA),\n      this.getSpace('postWhenExpressions'),\n      this.getKeyword('then', SqlWhenThenPart.DEFAULT_THEN_KEYWORD),\n      this.getSpace('postThen'),\n      this.thenExpression.toString(),\n    ].join('');\n  }\n\n  public changeWhenExpressions(\n    whenExpressions: SeparatedArray<SqlExpression> | SqlExpression[],\n  ): this {\n    const value = this.valueOf();\n    value.whenExpressions = SeparatedArray.fromArray(whenExpressions);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWhenExpression(whenExpression: SqlExpression): this {\n    return this.changeWhenExpressions([whenExpression]);\n  }\n\n  public changeThenExpression(thenExpression: SqlExpression): this {\n    const value = this.valueOf();\n    value.thenExpression = thenExpression;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlBase | undefined {\n    let ret = this;\n\n    const whenExpressions = SqlBase.walkSeparatedArray(\n      this.whenExpressions,\n      nextStack,\n      fn,\n      postorder,\n    );\n    if (!whenExpressions) return;\n    if (whenExpressions !== this.whenExpressions) {\n      ret = ret.changeWhenExpressions(whenExpressions);\n    }\n\n    const thenExpression = this.thenExpression._walkHelper(nextStack, fn, postorder);\n    if (!thenExpression) return;\n    if (thenExpression !== this.thenExpression) {\n      ret = ret.changeThenExpression(thenExpression);\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlWhenThenPart);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SeparatedArray, SPACE } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlExpression } from '../sql-expression';\nimport type { LiteralValue } from '../sql-literal/sql-literal';\n\nimport { SqlWhenThenPart } from './sql-when-then-part';\n\nexport interface SqlCaseValue extends SqlBaseValue {\n  caseExpression?: SqlExpression;\n  whenThenParts: SeparatedArray<SqlWhenThenPart>;\n  elseExpression?: SqlExpression;\n}\n\nexport class SqlCase extends SqlExpression {\n  static type: SqlTypeDesignator = 'case';\n\n  static DEFAULT_CASE_KEYWORD = 'CASE';\n  static DEFAULT_ELSE_KEYWORD = 'ELSE';\n  static DEFAULT_END_KEYWORD = 'END';\n\n  static ifThenElse(\n    conditionExpression: SqlExpression,\n    thenExpression: SqlExpression | LiteralValue,\n    elseExpression?: SqlExpression | LiteralValue,\n  ) {\n    return new SqlCase({\n      whenThenParts: SeparatedArray.fromSingleValue(\n        SqlWhenThenPart.create(conditionExpression, thenExpression),\n      ),\n      elseExpression:\n        typeof elseExpression !== 'undefined' ? SqlExpression.wrap(elseExpression) : undefined,\n    });\n  }\n\n  public readonly caseExpression?: SqlExpression;\n  public readonly whenThenParts: SeparatedArray<SqlWhenThenPart>;\n  public readonly elseExpression?: SqlExpression;\n\n  constructor(options: SqlCaseValue) {\n    super(options, SqlCase.type);\n    this.caseExpression = options.caseExpression;\n    this.whenThenParts = options.whenThenParts;\n    this.elseExpression = options.elseExpression;\n  }\n\n  public valueOf(): SqlCaseValue {\n    const value = super.valueOf() as SqlCaseValue;\n    value.caseExpression = this.caseExpression;\n    value.whenThenParts = this.whenThenParts;\n    value.elseExpression = this.elseExpression;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [\n      this.getKeyword('case', SqlCase.DEFAULT_CASE_KEYWORD),\n      this.getSpace('postCase'),\n    ];\n\n    if (this.caseExpression) {\n      rawParts.push(this.caseExpression.toString(), this.getSpace('postCaseExpression'));\n    }\n\n    rawParts.push(this.whenThenParts.toString(SPACE));\n\n    if (this.elseExpression) {\n      rawParts.push(\n        this.getSpace('preElse'),\n        this.getKeyword('else', SqlCase.DEFAULT_ELSE_KEYWORD),\n        this.getSpace('postElse'),\n        this.elseExpression.toString(),\n      );\n    }\n\n    rawParts.push(this.getSpace('preEnd'), this.getKeyword('end', SqlCase.DEFAULT_END_KEYWORD));\n\n    return rawParts.join('');\n  }\n\n  public changeCaseExpression(caseExpression: SqlExpression): this {\n    const value = this.valueOf();\n    value.caseExpression = caseExpression;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeWhenThenParts(whenThenParts: SeparatedArray<SqlWhenThenPart>): this {\n    const value = this.valueOf();\n    value.whenThenParts = whenThenParts;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeElseExpression(elseExpression: SqlExpression): this {\n    const value = this.valueOf();\n    value.elseExpression = elseExpression;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    if (this.caseExpression) {\n      const caseExpression = this.caseExpression._walkHelper(nextStack, fn, postorder);\n      if (!caseExpression) return;\n      if (caseExpression !== this.caseExpression) {\n        ret = ret.changeCaseExpression(caseExpression);\n      }\n    }\n\n    const whenThenParts = SqlBase.walkSeparatedArray(this.whenThenParts, nextStack, fn, postorder);\n    if (!whenThenParts) return;\n    if (whenThenParts !== this.whenThenParts) {\n      ret = ret.changeWhenThenParts(whenThenParts);\n    }\n\n    if (this.elseExpression) {\n      const elseExpression = this.elseExpression._walkHelper(nextStack, fn, postorder);\n      if (!elseExpression) return;\n      if (elseExpression !== this.elseExpression) {\n        ret = ret.changeElseExpression(elseExpression);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.whenThenParts = this.whenThenParts.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlCase);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport { SqlColumn } from '../sql-column/sql-column';\nimport type { SqlColumnList } from '../sql-column-list/sql-column-list';\nimport { SqlExpression } from '../sql-expression';\n\nexport interface SqlAliasValue extends SqlBaseValue {\n  expression: SqlExpression;\n  alias: RefName;\n  columns?: SqlColumnList;\n}\n\nexport class SqlAlias extends SqlExpression {\n  static type: SqlTypeDesignator = 'alias';\n\n  static DEFAULT_AS_KEYWORD = 'AS';\n\n  static create(\n    expression: SqlExpression,\n    alias: RefName | string,\n    forceQuotes?: boolean,\n  ): SqlAlias {\n    expression = SqlExpression.verify(expression);\n\n    if (expression instanceof SqlAlias) {\n      return expression.changeAlias(alias, forceQuotes);\n    }\n\n    if (expression.type === 'query') {\n      expression = expression.ensureParens();\n    }\n    return new SqlAlias({\n      expression,\n      alias: typeof alias === 'string' ? RefName.alias(alias, forceQuotes) : alias,\n    });\n  }\n\n  public readonly expression: SqlExpression;\n  public readonly alias: RefName;\n  public readonly columns?: SqlColumnList;\n\n  constructor(options: SqlAliasValue) {\n    super(options, SqlAlias.type);\n    this.expression = options.expression;\n    this.alias = options.alias;\n    this.columns = options.columns;\n  }\n\n  public valueOf() {\n    const value = super.valueOf() as SqlAliasValue;\n    value.expression = this.expression;\n    value.alias = this.alias;\n    value.columns = this.columns;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [this.expression.toString()];\n\n    if (this.keywords['as'] !== '') {\n      rawParts.push(this.getSpace('preAs'), this.getKeyword('as', SqlAlias.DEFAULT_AS_KEYWORD));\n    }\n\n    rawParts.push(this.getSpace('preAlias'), this.alias.toString());\n\n    if (this.columns) {\n      rawParts.push(this.getSpace('preColumns'), this.columns.toString());\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeExpression(expression: SqlExpression): this {\n    const value = this.valueOf();\n    value.expression = expression;\n    return SqlBase.fromValue(value);\n  }\n\n  public changeAlias(alias: string | RefName, forceQuotes = false): this {\n    const newAlias =\n      typeof alias === 'string'\n        ? forceQuotes\n          ? RefName.alias(alias, forceQuotes)\n          : this.alias.changeNameAsAlias(alias)\n        : alias;\n\n    const value = this.valueOf();\n    value.alias = newAlias;\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const expression = this.expression._walkHelper(nextStack, fn, postorder);\n    if (!expression) return;\n    if (expression !== this.expression) {\n      ret = ret.changeExpression(expression as any);\n    }\n\n    return ret;\n  }\n\n  public ifUnnamedAliasAs(_alias: RefName | string, _forceQuotes?: boolean): SqlExpression {\n    return this;\n  }\n\n  public convertToTable(): SqlExpression {\n    const { expression } = this;\n    if (expression instanceof SqlColumn) {\n      return this.changeExpression(expression.convertToTable());\n    }\n    return this;\n  }\n\n  public getAliasName(): string {\n    return this.alias.name;\n  }\n\n  public getOutputName(): string | undefined {\n    return this.alias.name;\n  }\n\n  public getUnderlyingExpression(): SqlExpression {\n    return this.expression;\n  }\n\n  public changeUnderlyingExpression(newExpression: SqlExpression): SqlExpression {\n    return this.changeExpression(newExpression);\n  }\n}\n\nSqlBase.register(SqlAlias);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlOrderByClause } from '../sql-clause';\nimport type { SqlPartitionByClause } from '../sql-clause/sql-partition-by-clause/sql-partition-by-clause';\n\nimport type { SqlFrameBound } from './sql-frame-bound';\n\nexport type FrameType = 'rows' | 'range';\n\nexport interface SqlWindowSpecValue extends SqlBaseValue {\n  windowName?: RefName;\n  partitionByClause?: SqlPartitionByClause;\n  orderByClause?: SqlOrderByClause;\n  frameType?: FrameType;\n  frameBound1?: SqlFrameBound;\n  frameBound2?: SqlFrameBound;\n}\n\nexport class SqlWindowSpec extends SqlBase {\n  static DEFAULT_ROWS_KEYWORD = 'ROWS';\n  static DEFAULT_RANGE_KEYWORD = 'RANGE';\n  static DEFAULT_BETWEEN_KEYWORD = 'BETWEEN';\n  static DEFAULT_AND_KEYWORD = 'AND';\n\n  static type: SqlTypeDesignator = 'windowSpec';\n\n  public readonly windowName?: RefName;\n  public readonly partitionByClause?: SqlPartitionByClause;\n  public readonly orderByClause?: SqlOrderByClause;\n  public readonly frameType?: FrameType;\n  public readonly frameBound1?: SqlFrameBound;\n  public readonly frameBound2?: SqlFrameBound;\n\n  constructor(options: SqlWindowSpecValue) {\n    super(options, SqlWindowSpec.type);\n    this.windowName = options.windowName;\n    this.partitionByClause = options.partitionByClause;\n    this.orderByClause = options.orderByClause;\n    this.frameType = options.frameType;\n    this.frameBound1 = options.frameBound1;\n    this.frameBound2 = options.frameBound2;\n  }\n\n  public valueOf(): SqlWindowSpecValue {\n    const value = super.valueOf() as SqlWindowSpecValue;\n    value.windowName = this.windowName;\n    value.partitionByClause = this.partitionByClause;\n    value.orderByClause = this.orderByClause;\n    value.frameType = this.frameType;\n    value.frameBound1 = this.frameBound1;\n    value.frameBound2 = this.frameBound2;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = ['(', this.getSpace('postLeftParen')];\n\n    if (this.windowName) {\n      rawParts.push(this.windowName.toString(), this.getSpace('postWindowName'));\n    }\n\n    if (this.partitionByClause) {\n      rawParts.push(this.partitionByClause.toString(), this.getSpace('postPartitionBy'));\n    }\n\n    if (this.orderByClause) {\n      rawParts.push(this.orderByClause.toString(), this.getSpace('postOrderBy'));\n    }\n\n    if (this.frameType && this.frameBound1) {\n      rawParts.push(\n        this.frameType === 'rows'\n          ? this.getKeyword('rows', SqlWindowSpec.DEFAULT_ROWS_KEYWORD)\n          : this.getKeyword('range', SqlWindowSpec.DEFAULT_RANGE_KEYWORD),\n        this.getSpace('postFrameType'),\n      );\n\n      if (this.frameBound2) {\n        rawParts.push(\n          this.getKeyword('between', SqlWindowSpec.DEFAULT_BETWEEN_KEYWORD),\n          this.getSpace('postBetween'),\n        );\n      }\n\n      rawParts.push(this.frameBound1.toString());\n\n      if (this.frameBound2) {\n        rawParts.push(\n          this.getSpace('preAnd'),\n          this.getKeyword('and', SqlWindowSpec.DEFAULT_AND_KEYWORD),\n          this.getSpace('postAnd'),\n          this.frameBound2.toString(),\n        );\n      }\n\n      rawParts.push(this.getSpace('postFrame'));\n    }\n\n    rawParts.push(')');\n\n    return rawParts.join('');\n  }\n\n  public changeWindowName(windowName: RefName | string | undefined): this {\n    const value = this.valueOf();\n    if (windowName) {\n      value.windowName = RefName.create(windowName);\n    } else {\n      delete value.windowName;\n      value.spacing = this.getSpacingWithout('postWindowName');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changePartitionByClause(partitionByClause: SqlPartitionByClause | undefined): this {\n    if (this.partitionByClause === partitionByClause) return this;\n    const value = this.valueOf();\n    if (partitionByClause) {\n      value.partitionByClause = partitionByClause;\n    } else {\n      delete value.partitionByClause;\n      value.spacing = this.getSpacingWithout('postPartitionBy');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByClause(orderByClause: SqlOrderByClause | undefined): this {\n    if (this.orderByClause === orderByClause) return this;\n    const value = this.valueOf();\n    if (orderByClause) {\n      value.orderByClause = orderByClause;\n    } else {\n      delete value.orderByClause;\n      value.spacing = this.getSpacingWithout('postOrderBy');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlWindowSpec | undefined {\n    let ret = this;\n\n    if (this.partitionByClause) {\n      const partitionByClause = this.partitionByClause._walkHelper(nextStack, fn, postorder);\n      if (!partitionByClause) return;\n      if (partitionByClause !== this.partitionByClause) {\n        ret = ret.changePartitionByClause(partitionByClause as SqlPartitionByClause);\n      }\n    }\n\n    if (this.orderByClause) {\n      const orderByClause = this.orderByClause._walkHelper(nextStack, fn, postorder);\n      if (!orderByClause) return;\n      if (orderByClause !== this.orderByClause) {\n        ret = ret.changeOrderByClause(orderByClause as SqlOrderByClause);\n      }\n    }\n\n    return ret;\n  }\n}\n\nSqlBase.register(SqlWindowSpec);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlBaseValue, SqlTypeDesignator } from '../sql-base';\nimport { SqlBase } from '../sql-base';\n\nexport type BoundValue = number | 'unbounded' | 'currentRow';\n\nexport interface SqlFrameBoundValue extends SqlBaseValue {\n  boundValue: BoundValue;\n  following?: boolean;\n}\n\nexport class SqlFrameBound extends SqlBase {\n  static type: SqlTypeDesignator = 'frameBound';\n\n  static DEFAULT_CURRENT_ROW_KEYWORD = 'CURRENT ROW';\n  static DEFAULT_UNBOUNDED_KEYWORD = 'UNBOUNDED';\n  static DEFAULT_PRECEDING_KEYWORD = 'PRECEDING';\n  static DEFAULT_FOLLOWING_KEYWORD = 'FOLLOWING';\n\n  static CURRENT_ROW: SqlFrameBound;\n\n  static preceding(n: number | 'unbounded') {\n    return new SqlFrameBound({\n      boundValue: n,\n      following: false,\n    });\n  }\n\n  static following(n: number | 'unbounded') {\n    return new SqlFrameBound({\n      boundValue: n,\n      following: true,\n    });\n  }\n\n  public readonly boundValue: BoundValue;\n  public readonly following?: boolean;\n\n  constructor(options: SqlFrameBoundValue) {\n    super(options, SqlFrameBound.type);\n    this.boundValue = options.boundValue;\n    this.following = options.following;\n  }\n\n  public valueOf(): SqlFrameBoundValue {\n    const value = super.valueOf() as SqlFrameBoundValue;\n    value.boundValue = this.boundValue;\n    value.following = this.following;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const rawParts: string[] = [];\n\n    if (this.boundValue === 'currentRow') {\n      rawParts.push(this.getKeyword('currentRow', SqlFrameBound.DEFAULT_CURRENT_ROW_KEYWORD));\n    } else {\n      if (this.boundValue === 'unbounded') {\n        rawParts.push(this.getKeyword('unbounded', SqlFrameBound.DEFAULT_UNBOUNDED_KEYWORD));\n      } else {\n        rawParts.push(String(this.boundValue));\n      }\n\n      rawParts.push(\n        this.getSpace('postBoundValue'),\n        this.following\n          ? this.getKeyword('following', SqlFrameBound.DEFAULT_FOLLOWING_KEYWORD)\n          : this.getKeyword('preceding', SqlFrameBound.DEFAULT_PRECEDING_KEYWORD),\n      );\n    }\n\n    return rawParts.join('');\n  }\n}\n\nSqlBase.register(SqlFrameBound);\n\nSqlFrameBound.CURRENT_ROW = new SqlFrameBound({ boundValue: 'currentRow' });\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isEmptyArray } from '../../utils';\nimport { NEWLINE, SeparatedArray, Separator, SPACE } from '../helpers';\nimport type { SqlBaseValue, SqlTypeDesignator, Substitutor } from '../sql-base';\nimport { SqlBase } from '../sql-base';\nimport type { SqlOrderByExpression } from '../sql-clause';\nimport { SqlLimitClause, SqlOffsetClause, SqlOrderByClause } from '../sql-clause';\nimport { SqlExpression } from '../sql-expression';\nimport type { SqlLiteral } from '../sql-literal/sql-literal';\nimport type { SqlRecord } from '../sql-record/sql-record';\n\nexport interface SqlValuesValue extends SqlBaseValue {\n  records: SeparatedArray<SqlRecord>;\n  orderByClause?: SqlOrderByClause;\n  limitClause?: SqlLimitClause;\n  offsetClause?: SqlOffsetClause;\n}\n\nexport class SqlValues extends SqlExpression {\n  static type: SqlTypeDesignator = 'values';\n\n  static DEFAULT_VALUES_KEYWORD = 'VALUES';\n\n  static create(records: SqlValues | SeparatedArray<SqlRecord> | SqlRecord[]): SqlValues {\n    if (records instanceof SqlValues) return records;\n    return new SqlValues({\n      records: SeparatedArray.fromArray(records),\n    }).ensureParens();\n  }\n\n  public readonly records: SeparatedArray<SqlRecord>;\n  public readonly orderByClause?: SqlOrderByClause;\n  public readonly limitClause?: SqlLimitClause;\n  public readonly offsetClause?: SqlOffsetClause;\n\n  constructor(options: SqlValuesValue) {\n    super(options, SqlValues.type);\n    this.records = options.records;\n    this.orderByClause = options.orderByClause;\n    this.limitClause = options.limitClause;\n    this.offsetClause = options.offsetClause;\n  }\n\n  public valueOf(): SqlValuesValue {\n    const value = super.valueOf() as SqlValuesValue;\n    value.records = this.records;\n    value.orderByClause = this.orderByClause;\n    value.limitClause = this.limitClause;\n    value.offsetClause = this.offsetClause;\n    return value;\n  }\n\n  protected _toRawString(): string {\n    const { records, orderByClause, limitClause, offsetClause } = this;\n\n    const multiline = records.length() > 1;\n    const rawParts: string[] = [\n      this.getKeyword('values', SqlValues.DEFAULT_VALUES_KEYWORD),\n      this.getSpace('postValues', multiline ? NEWLINE : SPACE),\n      records.toString(multiline ? Separator.COMMA_NEWLINE : Separator.COMMA),\n    ];\n\n    if (orderByClause) {\n      rawParts.push(this.getSpace('preOrderByClause', NEWLINE), orderByClause.toString());\n    }\n\n    if (limitClause) {\n      rawParts.push(this.getSpace('preLimitClause', NEWLINE), limitClause.toString());\n    }\n\n    if (offsetClause) {\n      rawParts.push(this.getSpace('preOffsetClause', NEWLINE), offsetClause.toString());\n    }\n\n    return rawParts.join('');\n  }\n\n  public changeRecords(records: SeparatedArray<SqlRecord> | SqlRecord[]): this {\n    const value = this.valueOf();\n    value.records = SeparatedArray.fromArray(records);\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByClause(orderByClause: SqlOrderByClause | undefined): this {\n    if (this.orderByClause === orderByClause) return this;\n    const value = this.valueOf();\n    if (orderByClause) {\n      value.orderByClause = orderByClause;\n    } else {\n      delete value.orderByClause;\n      value.spacing = this.getSpacingWithout('preOrderByClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOrderByExpressions(\n    orderByExpressions: SeparatedArray<SqlOrderByExpression> | SqlOrderByExpression[] | undefined,\n  ): this {\n    if (!orderByExpressions || isEmptyArray(orderByExpressions)) {\n      return this.changeOrderByClause(undefined);\n    } else {\n      return this.changeOrderByClause(\n        this.orderByClause\n          ? this.orderByClause.changeExpressions(orderByExpressions)\n          : SqlOrderByClause.create(orderByExpressions),\n      );\n    }\n  }\n\n  public changeOrderByExpression(orderByExpression: SqlOrderByExpression | undefined): this {\n    if (!orderByExpression) return this.changeOrderByClause(undefined);\n    return this.changeOrderByExpressions([orderByExpression]);\n  }\n\n  public changeLimitClause(limitClause: SqlLimitClause | undefined): this {\n    if (this.limitClause === limitClause) return this;\n    const value = this.valueOf();\n    if (limitClause) {\n      value.limitClause = limitClause;\n    } else {\n      delete value.limitClause;\n      value.spacing = this.getSpacingWithout('preLimitClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeLimitValue(limitValue: SqlLiteral | number | undefined): this {\n    if (typeof limitValue === 'number' && limitValue < 0) {\n      throw new Error(`${limitValue} is not a valid limit value`);\n    }\n    if (typeof limitValue === 'undefined') return this.changeLimitClause(undefined);\n    if (typeof limitValue === 'number' && !isFinite(limitValue)) {\n      return this.changeLimitClause(undefined);\n    }\n    return this.changeLimitClause(\n      this.limitClause\n        ? this.limitClause.changeLimit(limitValue)\n        : SqlLimitClause.create(limitValue),\n    );\n  }\n\n  public changeOffsetClause(offsetClause: SqlOffsetClause | undefined): this {\n    if (this.offsetClause === offsetClause) return this;\n    const value = this.valueOf();\n    if (offsetClause) {\n      value.offsetClause = offsetClause;\n    } else {\n      delete value.offsetClause;\n      value.spacing = this.getSpacingWithout('preOffsetClause');\n    }\n    return SqlBase.fromValue(value);\n  }\n\n  public changeOffsetValue(offsetValue: SqlLiteral | number | undefined): this {\n    if (typeof offsetValue === 'undefined') return this.changeOffsetClause(undefined);\n    return this.changeOffsetClause(\n      this.offsetClause\n        ? this.offsetClause.changeOffset(offsetValue)\n        : SqlOffsetClause.create(offsetValue),\n    );\n  }\n\n  public _walkInner(\n    nextStack: SqlBase[],\n    fn: Substitutor,\n    postorder: boolean,\n  ): SqlExpression | undefined {\n    let ret = this;\n\n    const records = SqlBase.walkSeparatedArray(this.records, nextStack, fn, postorder);\n    if (!records) return;\n    if (records !== this.records) {\n      ret = ret.changeRecords(records);\n    }\n\n    if (this.orderByClause) {\n      const orderByClause = this.orderByClause._walkHelper(nextStack, fn, postorder);\n      if (!orderByClause) return;\n      if (orderByClause !== this.orderByClause) {\n        ret = ret.changeOrderByClause(orderByClause as SqlOrderByClause);\n      }\n    }\n\n    if (this.limitClause) {\n      const limitClause = this.limitClause._walkHelper(nextStack, fn, postorder);\n      if (!limitClause) return;\n      if (limitClause !== this.limitClause) {\n        ret = ret.changeLimitClause(limitClause as SqlLimitClause);\n      }\n    }\n\n    if (this.offsetClause) {\n      const offsetClause = this.offsetClause._walkHelper(nextStack, fn, postorder);\n      if (!offsetClause) return;\n      if (offsetClause !== this.offsetClause) {\n        ret = ret.changeOffsetClause(offsetClause as SqlOffsetClause);\n      }\n    }\n\n    return ret;\n  }\n\n  public clearOwnSeparators(): this {\n    const value = this.valueOf();\n    value.records = this.records.clearSeparators();\n    return SqlBase.fromValue(value);\n  }\n}\n\nSqlBase.register(SqlValues);\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SqlColumn } from '../sql';\n\nexport function C(name: string | SqlColumn) {\n  return SqlColumn.create(name);\n}\n\nC.optionalQuotes = (name: string | SqlColumn) => {\n  return SqlColumn.optionalQuotes(name);\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LiteralValue, SqlExpression } from '../sql';\nimport { SqlFunction } from '../sql';\nimport { cleanFunctionArguments } from '../utils';\n\nexport const F = function (name: string, ...args: (SqlExpression | LiteralValue | undefined)[]) {\n  return SqlFunction.simple(name, cleanFunctionArguments(args));\n};\n\nF.cast = SqlFunction.cast;\nF.floor = SqlFunction.floor;\nF.timeFloor = SqlFunction.timeFloor;\nF.timeCeil = SqlFunction.timeCeil;\nF.timeShift = SqlFunction.timeShift;\nF.stringFormat = SqlFunction.stringFormat;\nF.array = SqlFunction.array;\nF.regexpLike = SqlFunction.regexpLike;\n\nF.count = SqlFunction.count;\nF.countDistinct = SqlFunction.countDistinct;\nF.sum = SqlFunction.sum;\nF.min = SqlFunction.min;\nF.max = SqlFunction.max;\nF.avg = SqlFunction.avg;\n\nF.jsonValue = SqlFunction.jsonValue;\nF.jsonObject = SqlFunction.jsonObject;\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LiteralValue } from '../sql';\nimport { SqlLiteral } from '../sql';\n\nexport function L(value: LiteralValue | SqlLiteral) {\n  return SqlLiteral.create(value);\n}\n\nL.NULL = SqlLiteral.NULL;\nL.FALSE = SqlLiteral.FALSE;\nL.TRUE = SqlLiteral.TRUE;\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SqlNamespace } from '../sql';\n\nexport function N(name: string | SqlNamespace) {\n  return SqlNamespace.create(name);\n}\n\nN.optionalQuotes = (name: string | SqlNamespace) => {\n  return SqlNamespace.optionalQuotes(name);\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SqlTable } from '../sql';\n\nexport function T(name: string | SqlTable) {\n  return SqlTable.create(name);\n}\n\nT.optionalQuotes = (name: string | SqlTable) => {\n  return SqlTable.optionalQuotes(name);\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefName, SqlExpression, SqlLiteral } from '../sql';\n\nexport function sql(strings: TemplateStringsArray, ...xs: any[]): SqlExpression {\n  const parts: string[] = strings.slice(0, 1);\n  const n = xs.length;\n  for (let i = 0; i < n; i++) {\n    const x = xs[i];\n    const before = strings[i]!;\n    const beforeLastChar = before[before.length - 1];\n    const after = strings[i + 1]!;\n    const afterFirstChar = after[0];\n    let toAdd: string;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (beforeLastChar) {\n      case '\"': {\n        // Detect ...\"${x}\"...\n        if (afterFirstChar !== '\"') {\n          throw new Error(`Expression \\`${x}\\` is not evenly wrapped in double quotes`);\n        }\n        const str = RefName.create(String(x)).toString();\n        toAdd = str.slice(1, -1); // Remove double quotes as they are already accounted for\n        break;\n      }\n\n      case \"'\": {\n        // Detect ...'${x}'...\n        if (afterFirstChar !== \"'\") {\n          throw new Error(`Literal \\`${x}\\` is not evenly wrapped in single quotes`);\n        }\n        const str = SqlLiteral.create(String(x)).toString();\n        toAdd = str.slice(1, -1); // Remove single quotes as they are already accounted for\n        break;\n      }\n\n      default:\n        if (afterFirstChar === '\"') {\n          throw new Error(`Expression \\`${x}\\` is not evenly wrapped in double quotes`);\n        }\n        if (afterFirstChar === \"'\") {\n          throw new Error(`Literal \\`${x}\\` is not evenly wrapped in single quotes`);\n        }\n        toAdd = SqlExpression.wrap(x).toString();\n        break;\n    }\n    parts.push(toAdd, after);\n  }\n\n  return SqlExpression.parse(parts.join(''));\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Column, QueryResult } from '../query-result';\nimport type { SqlTable } from '../sql';\nimport { SqlQuery } from '../sql';\nimport { dedupe } from '../utils';\n\nexport interface TableInfo {\n  name: string;\n}\n\ninterface QueryColumnIntrospectionQuery {\n  query: string;\n  resultFormat: 'array';\n  header: true;\n  typesHeader: true;\n  sqlTypesHeader: true;\n}\n\nexport class Introspect {\n  static getTableIntrospectionQuery(): string {\n    return `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'druid' AND TABLE_TYPE = 'TABLE'`;\n  }\n\n  static decodeTableIntrospectionResult(queryResult: QueryResult): TableInfo[] {\n    if (queryResult.isEmpty()) return [];\n    return queryResult.rows.map(r => ({ name: r[0] }));\n  }\n\n  static getQueryColumnIntrospectionQuery(query: SqlQuery | SqlTable): SqlQuery {\n    return SqlQuery.selectStarFrom(query).changeLimitValue(0);\n  }\n\n  static getQueryColumnIntrospectionPayload(\n    query: SqlQuery | SqlTable,\n  ): QueryColumnIntrospectionQuery {\n    return {\n      query: Introspect.getQueryColumnIntrospectionQuery(query).toString(),\n      resultFormat: 'array',\n      header: true,\n      typesHeader: true,\n      sqlTypesHeader: true,\n    };\n  }\n\n  static decodeQueryColumnIntrospectionResult(headerOnlyResult: QueryResult): Column[] {\n    // Remove any column that does not have a \"real\" name as it can not be referenced\n    // Deduplicate columns, taking only the first one if there are several functions with the same name\n    return dedupe(\n      headerOnlyResult.header.filter(column => !SqlQuery.isPhonyOutputName(column.name)),\n      column => column.name,\n    );\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ColumnOptions {\n  name: string;\n  sqlType?: string;\n  nativeType?: string;\n}\n\nexport class Column {\n  static fromName(name: unknown): Column {\n    return new Column({ name: String(name) });\n  }\n\n  static fromColumnNames(names: readonly unknown[]): Column[] {\n    return names.map(Column.fromName);\n  }\n\n  static fromColumnNamesAndTypeArrays(\n    names: readonly unknown[],\n    types: string[] = [],\n    sqlTypes: string[] = [],\n  ): Column[] {\n    return names.map(\n      (name, i) => new Column({ name: String(name), nativeType: types[i], sqlType: sqlTypes[i] }),\n    );\n  }\n\n  static fromColumnNamesAndTypeArray(\n    names: readonly unknown[],\n    typeArray: { type: string; sqlType: string }[] = [],\n  ): Column[] {\n    return names.map(\n      (name, i) =>\n        new Column({\n          name: String(name),\n          nativeType: typeArray[i]?.type,\n          sqlType: typeArray[i]?.sqlType,\n        }),\n    );\n  }\n\n  public readonly name: string;\n  public readonly sqlType?: string;\n  public readonly nativeType?: string;\n\n  constructor(options: ColumnOptions) {\n    this.name = options.name;\n    this.sqlType = options.sqlType;\n    this.nativeType = options.nativeType;\n  }\n\n  public isTimeColumn(): boolean {\n    const { name, sqlType } = this;\n    return name === '__time' && sqlType === 'TIMESTAMP';\n  }\n\n  public isNumeric(): boolean {\n    const { sqlType } = this;\n    return sqlType === 'BIGINT' || sqlType === 'FLOAT' || sqlType === 'DOUBLE';\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { QueryPayload } from '../query-payload/query-payload';\nimport type { SqlQuery } from '../sql';\nimport { filterMap } from '../utils';\n\nimport { Column } from './column';\n\nfunction isObject(obj: unknown): obj is Record<string, unknown> {\n  return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n//              Matches: \"2016-06-27T00:00:00.000Z\"\nconst FULL_ISO_REGEXP = /^\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d.\\d\\d\\dZ$/;\n\nfunction isIsoDate(thing: unknown): boolean {\n  return (\n    typeof thing === 'string' && FULL_ISO_REGEXP.test(thing) && !isNaN(new Date(thing).valueOf())\n  );\n}\n\nfunction isAllGranularity(granularity: unknown): boolean {\n  if (typeof granularity === 'string') {\n    return granularity.toLowerCase() === 'all';\n  }\n  if (isObject(granularity) && typeof (granularity as any).type === 'string') {\n    return (granularity as any).type.toLowerCase() === 'all';\n  }\n  return false;\n}\n\nexport interface QueryResultValue {\n  header: readonly Column[];\n  rows: readonly any[][];\n  query?: QueryPayload;\n  sqlQuery?: SqlQuery;\n  queryId?: string;\n  sqlQueryId?: string;\n  resultContext?: Record<string, any>;\n  queryDuration?: number;\n}\n\nexport class QueryResult {\n  static BLANK: QueryResult;\n  static jsonParse: (str: string) => any = JSON.parse;\n\n  static shouldIncludeTimestamp(queryPayload: QueryPayload): boolean {\n    return Boolean('granularity' in queryPayload && !isAllGranularity(queryPayload.granularity));\n  }\n\n  static hasHeader(queryPayload: QueryPayload): boolean {\n    return typeof queryPayload.query === 'string' && queryPayload.header === true;\n  }\n\n  static hasTypeHeader(queryPayload: QueryPayload, header: Record<string, string>): boolean {\n    return (\n      QueryResult.hasHeader(queryPayload) &&\n      queryPayload.typesHeader === true &&\n      header['x-druid-sql-header-included'] === 'yes'\n    );\n  }\n\n  static hasSqlTypeHeader(queryPayload: QueryPayload, header: Record<string, string>): boolean {\n    return (\n      QueryResult.hasHeader(queryPayload) &&\n      queryPayload.sqlTypesHeader === true &&\n      header['x-druid-sql-header-included'] === 'yes'\n    );\n  }\n\n  static fromQueryAndRawResult(\n    queryPayload: QueryPayload,\n    data: unknown,\n    header: Record<string, string> = {},\n  ): QueryResult {\n    return QueryResult.fromRawResult(\n      data,\n      QueryResult.shouldIncludeTimestamp(queryPayload),\n      QueryResult.hasHeader(queryPayload),\n      QueryResult.hasTypeHeader(queryPayload, header),\n      QueryResult.hasSqlTypeHeader(queryPayload, header),\n    );\n  }\n\n  static fromRawResult(\n    data: unknown,\n    includeTimestampIfExists?: boolean,\n    hasHeader?: boolean,\n    hasTypeHeader?: boolean,\n    hasSqlTypeHeader?: boolean,\n  ): QueryResult {\n    if (typeof data === 'string') {\n      if (data === '') {\n        throw new Error(\n          `Query results were empty. This may indicate a timeout caused by an intermediate network device (such as a load balancer). Try re-running your query, using a lower limit.`,\n        );\n      } else if (!data.endsWith('\\n')) {\n        // For more context read the section on result truncation in the Druid docs:\n        // https://druid.apache.org/docs/latest/api-reference/sql-api#client-side-error-handling-and-truncated-responses\n        throw new Error(\n          `Query results were truncated midstream. This may indicate a server-side error or a client-side issue. Try re-running your query using a lower limit.`,\n        );\n      }\n\n      const trimmedDataString = data.trimEnd();\n      if (trimmedDataString === '') {\n        data = [];\n      } else {\n        data = trimmedDataString.split('\\n').map((line, i) => {\n          try {\n            return QueryResult.jsonParse(line);\n          } catch {\n            throw new Error(`Unparsable row on line ${i + 1} in query result: '${line}'.`);\n          }\n        });\n      }\n    }\n\n    // Possibly unwrap the result context\n    let resultContext: Record<string, any> | undefined;\n    if (isObject(data) && data.results) {\n      if (isObject(data.context)) {\n        resultContext = data.context;\n      }\n      data = data.results;\n    }\n\n    if (Array.isArray(data)) {\n      const firstRow = data[0];\n      if (!firstRow) return QueryResult.BLANK.changeResultContext(resultContext);\n\n      if (Array.isArray(firstRow)) {\n        let rowsToSkip = 0;\n        let header: Column[];\n        if (hasHeader) {\n          rowsToSkip++;\n\n          let types: string[] | undefined;\n          if (hasTypeHeader) {\n            types = data[rowsToSkip];\n            rowsToSkip++;\n          }\n\n          let sqlTypes: string[] | undefined;\n          if (hasSqlTypeHeader) {\n            sqlTypes = data[rowsToSkip];\n            rowsToSkip++;\n          }\n\n          header = Column.fromColumnNamesAndTypeArrays(firstRow, types, sqlTypes);\n        } else {\n          header = Column.fromColumnNames(firstRow.map((_d, i) => i));\n        }\n\n        return new QueryResult({\n          header,\n          rows: rowsToSkip ? data.slice(rowsToSkip) : data,\n          resultContext,\n        });\n      }\n\n      if (!isObject(firstRow)) {\n        throw new Error(`Unexpected query result, array of non objects or arrays.`);\n      }\n\n      if (typeof firstRow.timestamp === 'string' && firstRow.result) {\n        const firstRowResult = firstRow.result;\n\n        if (isObject(firstRowResult)) {\n          // bySegment like\n          if (Array.isArray(firstRowResult.results)) {\n            return QueryResult.fromRawResult(\n              data.flatMap(d => d.result.results),\n              includeTimestampIfExists,\n              hasHeader,\n            ).changeResultContext(resultContext);\n          }\n\n          // select like\n          if (\n            isObject(firstRowResult.pagingIdentifiers) &&\n            Array.isArray(firstRowResult.dimensions) &&\n            Array.isArray(firstRowResult.metrics) &&\n            Array.isArray(firstRowResult.events)\n          ) {\n            const selectHeader = ['timestamp'].concat(\n              firstRowResult.dimensions,\n              firstRowResult.metrics,\n            );\n            return new QueryResult({\n              header: Column.fromColumnNames(selectHeader),\n              rows: data.flatMap(r =>\n                r.result.events.map((r: { event: Record<string, any> }) =>\n                  selectHeader.map(h => r.event[h]),\n                ),\n              ),\n              resultContext,\n            });\n          }\n\n          // timeseries like\n          const header = Object.keys(firstRowResult);\n          return new QueryResult({\n            header: Column.fromColumnNames(\n              includeTimestampIfExists ? ['timestamp'].concat(header) : header,\n            ),\n            rows: data.map((r: Record<string, any>) => {\n              const { timestamp, result } = r;\n              const rest = header.map(h => result[h]);\n              return includeTimestampIfExists ? [timestamp].concat(rest) : rest;\n            }),\n            resultContext,\n          });\n        }\n\n        // topN like\n        if (Array.isArray(firstRowResult)) {\n          const firstSubRow = data.find(r => r.result[0]);\n          if (!firstSubRow) return QueryResult.BLANK;\n          const header = Object.keys(firstSubRow.result[0]);\n          return new QueryResult({\n            header: Column.fromColumnNames(\n              includeTimestampIfExists ? ['timestamp'].concat(header) : header,\n            ),\n            rows: data.flatMap((r: Record<string, any>) => {\n              const { timestamp, result } = r;\n              return result.map((subResult: Record<string, any>) => {\n                const rest = header.map(h => subResult[h]);\n                return includeTimestampIfExists ? [timestamp].concat(rest) : rest;\n              });\n            }),\n            resultContext,\n          });\n        }\n      }\n\n      // groupBy like\n      if (typeof firstRow.timestamp === 'string' && isObject(firstRow.event)) {\n        const header = Object.keys(firstRow.event);\n        return new QueryResult({\n          header: Column.fromColumnNames(\n            includeTimestampIfExists ? ['timestamp'].concat(header) : header,\n          ),\n          rows: data.map((r: Record<string, any>) => {\n            const { timestamp, event } = r;\n            const rest = header.map(h => event[h]);\n            return includeTimestampIfExists ? [timestamp].concat(rest) : rest;\n          }),\n          resultContext,\n        });\n      }\n\n      // scan like\n      if (Array.isArray(firstRow.columns) && Array.isArray(firstRow.events)) {\n        const firstRowColumnsKey = firstRow.columns.join('#');\n        const headerNames: string[] = firstRow.columns;\n\n        // It is possible that in a scan query we will have a different header structure for different segments\n        // This code is meant to unify the columns across the different headers\n        const headerNameToIndex = new Map<string, number>();\n        for (let i = 0; i < headerNames.length; i++) {\n          headerNameToIndex.set(headerNames[i]!, i);\n        }\n        const headerRemaps: (Map<string, number> | undefined)[] = data.map(({ columns }, i) => {\n          if (i === 0 || columns.join('#') === firstRowColumnsKey) return;\n          const remap = new Map<string, number>();\n          for (let j = 0; j < columns.length; j++) {\n            const column = columns[j];\n            if (!headerNameToIndex.has(column)) {\n              headerNameToIndex.set(column, headerNames.length);\n              headerNames.push(column);\n            }\n            remap.set(column, j);\n          }\n          return remap;\n        });\n\n        const header: Column[] = Column.fromColumnNames(headerNames);\n        const firstSubRow = data.find(r => r.events[0]);\n        if (!firstSubRow) return new QueryResult({ header, rows: [] });\n        const firstSubRowEvents = firstSubRow.events[0];\n\n        // scan compactedList like\n        if (Array.isArray(firstSubRowEvents)) {\n          return new QueryResult({\n            header,\n            rows: data.flatMap(({ events }, i) => {\n              const headerRemap = headerRemaps[i];\n\n              // If there is no remap then we can use the event as-is\n              if (!headerRemap) return events;\n\n              // Apply the remap if it exists\n              return events.map((event: any[]) => {\n                return headerNames.map(column => {\n                  if (!headerRemap.has(column)) return null;\n                  return event[headerRemap.get(column)!];\n                });\n              });\n            }),\n            resultContext,\n          });\n        }\n\n        // scan list like\n        if (isObject(firstSubRowEvents)) {\n          return new QueryResult({\n            header,\n            rows: data.flatMap(({ events }) =>\n              events.map((event: any) => headerNames.map(h => event[h])),\n            ),\n            resultContext,\n          });\n        }\n\n        throw new Error(`Unexpected scan like results.`);\n      }\n\n      // segmentMetadata like\n      if (typeof firstRow.id === 'string' && isObject(firstRow.columns)) {\n        const flatArray = data.flatMap(({ columns, aggregators }) =>\n          Object.entries(columns).map(([k, v]) => ({\n            column: k,\n            ...(v as any),\n            aggregator: aggregators?.[k] || null,\n          })),\n        );\n        return QueryResult.fromObjectArray(flatArray).changeResultContext(resultContext);\n      }\n\n      // sql object mode like\n      return QueryResult.fromObjectArray(\n        data,\n        hasHeader,\n        hasTypeHeader || hasSqlTypeHeader,\n      ).changeResultContext(resultContext);\n    }\n\n    throw new Error('Unrecognizable query return shape, not an array.');\n  }\n\n  static fromObjectArray(\n    array: Record<string, any>[],\n    hasHeader?: boolean,\n    hasTypes?: boolean,\n  ): QueryResult {\n    const firstRow = array[0];\n    if (!firstRow) return QueryResult.BLANK;\n    const header = Object.keys(firstRow);\n    return new QueryResult({\n      header: Column.fromColumnNamesAndTypeArray(\n        header,\n        hasHeader && hasTypes ? header.map(h => firstRow[h]) : undefined,\n      ),\n      rows: (hasHeader ? array.slice(1) : array).map(r => header.map(h => r[h])),\n    });\n  }\n\n  public readonly header: readonly Column[];\n  public readonly rows: readonly any[][];\n\n  public readonly query?: QueryPayload;\n  public readonly sqlQuery?: SqlQuery;\n\n  public readonly queryId?: string;\n  public readonly sqlQueryId?: string;\n  public readonly resultContext?: Record<string, any>;\n  public readonly queryDuration?: number;\n\n  constructor(value: QueryResultValue) {\n    this.header = value.header;\n    this.rows = value.rows;\n    this.query = value.query;\n    this.sqlQuery = value.sqlQuery;\n    this.queryId = value.queryId;\n    this.sqlQueryId = value.sqlQueryId;\n    this.resultContext = value.resultContext;\n    this.queryDuration = value.queryDuration;\n  }\n\n  public valueOf(): QueryResultValue {\n    return {\n      header: this.header,\n      rows: this.rows,\n      query: this.query,\n      sqlQuery: this.sqlQuery,\n      queryId: this.queryId,\n      sqlQueryId: this.sqlQueryId,\n      resultContext: this.resultContext,\n      queryDuration: this.queryDuration,\n    };\n  }\n\n  public changeQueryDuration(queryDuration: number): QueryResult {\n    const value = this.valueOf();\n    value.queryDuration = queryDuration;\n    return new QueryResult(value);\n  }\n\n  public attachQuery(queryPayload: QueryPayload, sqlQuery?: SqlQuery): QueryResult {\n    const value = this.valueOf();\n    value.query = queryPayload;\n    value.sqlQuery = sqlQuery;\n\n    return new QueryResult(value);\n  }\n\n  public attachQueryId(queryId: string | undefined, sqlQueryId?: string): QueryResult {\n    const value = this.valueOf();\n    value.queryId = queryId;\n    value.sqlQueryId = sqlQueryId;\n    return new QueryResult(value);\n  }\n\n  public changeResultContext(resultContext: Record<string, any> | undefined): QueryResult {\n    if (this.resultContext === resultContext) return this;\n    const value = this.valueOf();\n    value.resultContext = resultContext;\n    return new QueryResult(value);\n  }\n\n  public getHeaderNames(): string[] {\n    return this.header.map(h => h.name);\n  }\n\n  public isEmpty(): boolean {\n    return !this.rows.length;\n  }\n\n  public getNumResults(): number {\n    return this.rows.length;\n  }\n\n  public toObjectArray(): Record<string, any>[] {\n    const headerNames = this.getHeaderNames();\n    const n = headerNames.length;\n    return this.rows.map(row => {\n      const obj: Record<string, any> = {};\n      for (let i = 0; i < n; i++) {\n        obj[headerNames[i]!] = row[i];\n      }\n      return obj;\n    });\n  }\n\n  public getColumnByIndex(columnIndex: number): any[] | undefined {\n    if (!this.header[columnIndex]) return;\n    return this.rows.map(row => row[columnIndex]);\n  }\n\n  public getColumnByName(columnName: string): any[] | undefined {\n    const columnIndex = this.header.findIndex(h => h.name === columnName);\n    if (columnIndex < 0) return;\n    return this.getColumnByIndex(columnIndex);\n  }\n\n  public getSqlOuterLimit(): number | undefined {\n    const { query } = this;\n    if (!query) return;\n    const { context } = query;\n    if (typeof context !== 'object') return;\n    return (context as any).sqlOuterLimit;\n  }\n\n  private guessDateColumnIndexes(): number[] {\n    const { header, rows } = this;\n    if (!rows.length) return [];\n    const indexes = header.map((_x, i) => i);\n    for (const row of rows) {\n      let i = 0;\n      while (i < indexes.length) {\n        const index = indexes[i]!;\n        if (row[index] == null || isIsoDate(row[index])) {\n          i++;\n        } else {\n          indexes.splice(i, 1);\n        }\n      }\n      if (!indexes.length) break; // Don't bother scanning the rest\n    }\n    return indexes;\n  }\n\n  private inflateDatesForIndexes(indexes: number[]): QueryResult {\n    if (!indexes.length) return this;\n\n    const value = this.valueOf();\n    value.rows = this.rows.map(row => {\n      row = row.slice();\n      for (const index of indexes) {\n        if (row[index] == null) continue;\n        const v = row[index];\n        row[index] = new Date(typeof v === 'bigint' ? Number(v) : v);\n      }\n      return row;\n    });\n    return new QueryResult(value);\n  }\n\n  public inflateDatesByGuessing(): QueryResult {\n    return this.inflateDatesForIndexes(this.guessDateColumnIndexes());\n  }\n\n  public inflateDatesFromSqlTypes(): QueryResult {\n    return this.inflateDatesForIndexes(\n      filterMap(this.header, (c, i) => (c.sqlType === 'TIMESTAMP' ? i : undefined)),\n    );\n  }\n}\n\nQueryResult.BLANK = new QueryResult({ header: [], rows: [] });\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { QueryParameter, QueryPayload } from '../query-payload/query-payload';\nimport { QueryResult } from '../query-result';\nimport { SqlQuery } from '../sql';\n\nexport interface DataAndHeaders {\n  data: unknown;\n  headers: Record<string, string>;\n}\n\nexport interface QueryExecutorArgs {\n  payload: QueryPayload;\n  isSql: boolean;\n  signal: AbortSignal | undefined;\n}\n\nexport type QueryExecutor = (args: QueryExecutorArgs) => Promise<DataAndHeaders>;\n\nexport interface RunQueryOptions {\n  query: string | SqlQuery | QueryPayload;\n  defaultQueryContext?: Record<string, any>;\n  extraQueryContext?: Record<string, any>;\n  queryParameters?: QueryParameter[];\n  resultFormat?: string;\n  header?: boolean;\n  typesHeader?: boolean;\n  sqlTypesHeader?: boolean;\n  signal?: AbortSignal;\n}\n\nexport type InflateDateStrategy = 'fromSqlTypes' | 'guess' | 'none';\n\nexport interface QueryRunnerOptions {\n  executor?: QueryExecutor;\n  inflateDateStrategy?: InflateDateStrategy;\n}\n\nexport class QueryRunner {\n  static defaultQueryExecutor?: QueryExecutor;\n\n  static now(): number {\n    return Date.now();\n  }\n\n  static isEmptyContext(context: Record<string, any> | undefined): boolean {\n    return !context || Object.keys(context).length === 0;\n  }\n\n  public readonly executor?: QueryExecutor;\n  public readonly inflateDateStrategy: InflateDateStrategy;\n\n  constructor(options: QueryRunnerOptions = {}) {\n    this.executor = options.executor;\n    this.inflateDateStrategy = options.inflateDateStrategy || 'fromSqlTypes';\n  }\n\n  private getExecutor(): QueryExecutor {\n    const executor = this.executor || QueryRunner.defaultQueryExecutor;\n    if (!executor) {\n      throw new Error(`Query executor must be provided or a default must be defined`);\n    }\n    return executor;\n  }\n\n  public async runQuery(options: RunQueryOptions): Promise<QueryResult> {\n    const {\n      query,\n      defaultQueryContext,\n      extraQueryContext,\n      queryParameters,\n      resultFormat,\n      header,\n      typesHeader,\n      sqlTypesHeader,\n      signal,\n    } = options;\n\n    let isSql: boolean;\n    let queryPayload: QueryPayload;\n    let parsedQuery: SqlQuery | undefined;\n    if (typeof query === 'string') {\n      isSql = true;\n      queryPayload = {\n        query,\n        resultFormat: resultFormat ?? 'array',\n        header: header ?? true,\n        typesHeader: (header && typesHeader) ?? true,\n        sqlTypesHeader: (header && sqlTypesHeader) ?? true,\n      };\n      try {\n        parsedQuery = SqlQuery.parse(query);\n      } catch {}\n    } else if (query instanceof SqlQuery) {\n      isSql = true;\n      parsedQuery = query;\n      queryPayload = {\n        query: String(query),\n        resultFormat: resultFormat ?? 'array',\n        header: header ?? true,\n        typesHeader: (header && typesHeader) ?? true,\n        sqlTypesHeader: (header && sqlTypesHeader) ?? true,\n      };\n    } else {\n      queryPayload = query;\n      isSql = !('queryType' in queryPayload) && typeof queryPayload.query === 'string';\n      if (isSql) {\n        try {\n          parsedQuery = SqlQuery.parse(queryPayload.query);\n        } catch {}\n      }\n    }\n\n    if (\n      !QueryRunner.isEmptyContext(defaultQueryContext) ||\n      !QueryRunner.isEmptyContext(extraQueryContext)\n    ) {\n      queryPayload = {\n        ...queryPayload,\n        context: {\n          ...defaultQueryContext,\n          ...(queryPayload.context || {}),\n          ...extraQueryContext,\n        },\n      };\n    }\n\n    if (\n      typeof queryPayload.query === 'string' &&\n      Array.isArray(queryParameters) &&\n      queryParameters.length\n    ) {\n      queryPayload = { ...queryPayload, parameters: queryParameters };\n    }\n\n    const startTime = QueryRunner.now();\n    const dataAndHeaders = await this.getExecutor()({ payload: queryPayload, isSql, signal });\n    const endTime = QueryRunner.now();\n\n    if (signal) signal.throwIfAborted();\n\n    const result = QueryResult.fromQueryAndRawResult(\n      queryPayload,\n      dataAndHeaders.data,\n      dataAndHeaders.headers,\n    )\n      .attachQuery(queryPayload, parsedQuery)\n      .attachQueryId(\n        dataAndHeaders.headers['x-druid-query-id'],\n        dataAndHeaders.headers['x-druid-sql-query-id'],\n      )\n      .changeQueryDuration(endTime - startTime);\n\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (this.inflateDateStrategy) {\n      case 'fromSqlTypes':\n        return result.inflateDatesFromSqlTypes();\n\n      case 'guess':\n        return result.inflateDatesByGuessing();\n\n      default:\n        return result;\n    }\n  }\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { LiteralValue, SqlExpression, SqlRecord } from '../sql';\nimport { SqlFunction, SqlLiteral, SqlType, SqlUnary } from '../sql';\nimport { filterMap } from '../utils';\n\nexport interface FilterPatternDefinition<P> {\n  fit(ex: SqlExpression): P | undefined;\n  isValid(pattern: P): boolean;\n  toExpression(pattern: P): SqlExpression;\n  getThing(pattern: P): string | undefined;\n}\n\nexport function extractOuterNot(ex: SqlExpression): [boolean, SqlExpression] {\n  let negated = false;\n  while (ex instanceof SqlUnary && ex.op === 'NOT') {\n    negated = !negated;\n    ex = ex.argument.changeParens([]);\n  }\n  return [negated, ex];\n}\n\nexport function sqlRecordGetLiteralValues(record: SqlRecord): LiteralValue[] | undefined {\n  const exs = record.expressions ? record.expressions.values : [];\n  const values = filterMap(exs, ex => (ex instanceof SqlLiteral ? ex.value : undefined));\n  return exs.length === values.length ? values : undefined;\n}\n\nexport function castAsVarchar(ex: SqlExpression): SqlExpression {\n  return SqlFunction.cast(ex, 'VARCHAR');\n}\n\nexport function unwrapCastAsVarchar(ex: SqlExpression): SqlExpression {\n  if (ex instanceof SqlFunction && ex.getEffectiveFunctionName() === 'CAST') {\n    const t = ex.getArg(1);\n    if (t instanceof SqlType && t.getEffectiveType() === 'VARCHAR') {\n      return ex.getArg(0)!;\n    }\n  }\n  return ex;\n}\n\nexport function oneOf<T>(thing: T, ...options: T[]): boolean {\n  return options.includes(thing);\n}\n\nexport function xor(a: unknown, b: unknown): boolean {\n  return Boolean(a ? !b : b);\n}\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, F, L } from '../shortcuts';\nimport type { SqlExpression } from '../sql';\nimport { SqlColumn, SqlFunction } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { castAsVarchar, extractOuterNot, unwrapCastAsVarchar } from './common';\n\nexport interface ContainsFilterPattern {\n  type: 'contains';\n  negated: boolean;\n  column: string;\n  contains: string;\n}\n\nexport const CONTAINS_PATTERN_DEFINITION: FilterPatternDefinition<ContainsFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    // ICONTAINS_STRING(CAST(\"lol\" AS VARCHAR), 'hello')\n    const [negated, ex] = extractOuterNot(possibleEx);\n    if (!(ex instanceof SqlFunction)) return;\n\n    if (ex.getEffectiveFunctionName() !== 'ICONTAINS_STRING') return;\n\n    let columnEx = ex.getArg(0);\n    if (!columnEx) return;\n    columnEx = unwrapCastAsVarchar(columnEx);\n    if (!(columnEx instanceof SqlColumn)) return;\n\n    const needle = ex.getArgAsString(1);\n    if (!needle) return;\n\n    return {\n      type: 'contains',\n      negated,\n      column: columnEx.getName(),\n      contains: needle,\n    };\n  },\n  isValid(pattern): boolean {\n    return Boolean(pattern.contains);\n  },\n  toExpression(pattern): SqlExpression {\n    return F('ICONTAINS_STRING', castAsVarchar(C(pattern.column)), L(pattern.contains)).applyIf(\n      pattern.negated,\n      ex => ex.negate(),\n    );\n  },\n  getThing(pattern): string | undefined {\n    return pattern.contains;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SqlExpression } from '../sql';\nimport { SqlLiteral } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot } from './common';\n\nexport interface CustomFilterPattern {\n  type: 'custom';\n  negated: boolean;\n  expression?: SqlExpression;\n}\n\nexport const CUSTOM_PATTERN_DEFINITION: FilterPatternDefinition<CustomFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    const [negated, ex] = extractOuterNot(possibleEx);\n\n    return {\n      type: 'custom',\n      negated,\n      expression: ex,\n    };\n  },\n  isValid(pattern): boolean {\n    return Boolean(pattern.expression);\n  },\n  toExpression(pattern): SqlExpression {\n    return (pattern.expression || SqlLiteral.TRUE).applyIf(pattern.negated, ex => ex.not());\n  },\n  getThing(_pattern): string | undefined {\n    return;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, F } from '../shortcuts';\nimport type { LiteralValue, SqlExpression } from '../sql';\nimport { SqlColumn, SqlFunction, SqlLiteral } from '../sql';\nimport { filterMap } from '../utils';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot } from './common';\n\nexport interface MvContainsFilterPattern {\n  type: 'mvContains';\n  negated: boolean;\n  column: string;\n  values: LiteralValue[];\n}\n\nexport const MV_CONTAINS_PATTERN_DEFINITION: FilterPatternDefinition<MvContainsFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    const [negated, ex] = extractOuterNot(possibleEx);\n    if (!(ex instanceof SqlFunction)) return;\n\n    if (ex.getEffectiveFunctionName() !== 'MV_CONTAINS') return;\n\n    const columnEx = ex.getArg(0);\n    if (!(columnEx instanceof SqlColumn)) return;\n\n    const valuesEx = ex.getArg(1);\n    if (!(valuesEx instanceof SqlFunction) || valuesEx.getEffectiveFunctionName() !== 'ARRAY')\n      return;\n\n    const valueArgs = valuesEx.getArgArray();\n    const values = filterMap(valueArgs, valueArg =>\n      valueArg instanceof SqlLiteral ? valueArg.value : undefined,\n    );\n    if (valueArgs.length !== values.length) return;\n\n    return {\n      type: 'mvContains',\n      negated,\n      column: columnEx.getName(),\n      values,\n    };\n  },\n  isValid(pattern) {\n    return Array.isArray(pattern.values) && Boolean(pattern.values.length);\n  },\n  toExpression(pattern) {\n    return F('MV_CONTAINS', C(pattern.column), F.array(...pattern.values)).applyIf(\n      pattern.negated,\n      ex => ex.negate(),\n    );\n  },\n  getThing(pattern) {\n    return pattern.values.length ? String(pattern.values[0]) : undefined;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, L } from '../shortcuts';\nimport { SqlColumn, SqlComparison, SqlExpression, SqlLiteral, SqlMulti } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot } from './common';\n\nexport interface NumberRangeFilterPattern {\n  type: 'numberRange';\n  negated: boolean;\n  column: string;\n  start: number | undefined;\n  end: number | undefined;\n  startBound: '(' | '[';\n  endBound: ')' | ']';\n}\n\nexport const NUMBER_RANGE_PATTERN_DEFINITION: FilterPatternDefinition<NumberRangeFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    const [negated, ex] = extractOuterNot(possibleEx);\n\n    if (ex instanceof SqlComparison) {\n      if (!(ex.rhs instanceof SqlLiteral && ex.lhs instanceof SqlColumn)) return;\n\n      const value = ex.rhs.value;\n\n      if (typeof value !== 'number' || isNaN(value)) return;\n\n      if (['>', '>='].includes(ex.op)) {\n        return {\n          type: 'numberRange',\n          column: ex.getFirstColumnName()!,\n          negated,\n          start: value,\n          end: undefined,\n          startBound: ex.op === '>' ? '(' : '[',\n          endBound: ')', // doesn't really matter\n        };\n      } else if (['<', '<='].includes(ex.op)) {\n        const value = ex.rhs.value;\n        if (typeof value !== 'number' || isNaN(value)) return;\n\n        return {\n          type: 'numberRange',\n          column: ex.getFirstColumnName()!,\n          negated,\n          start: undefined,\n          end: value,\n          startBound: '(', // doesn't really matter\n          endBound: ex.op === '<' ? ')' : ']',\n        };\n      }\n    }\n\n    if (!(ex instanceof SqlMulti)) return;\n    const args = ex.getArgArray();\n\n    if (args.length !== 2) return;\n\n    if (!args.every(v => v instanceof SqlComparison)) return;\n\n    const values = args as SqlComparison[];\n\n    const left = values.find(v => {\n      return (\n        ((v.op === '>' || v.op === '>=') && v.rhs instanceof SqlLiteral) ||\n        ((v.op === '<' || v.op === '<=') && v.rhs instanceof SqlColumn)\n      );\n    });\n    const right = values.find(v => {\n      return (\n        ((v.op === '>' || v.op === '>=') && v.rhs instanceof SqlColumn) ||\n        ((v.op === '<' || v.op === '<=') && v.rhs instanceof SqlLiteral)\n      );\n    });\n\n    if (!left || !right) return;\n\n    if (left.getFirstColumnName() !== right.getFirstColumnName()) return;\n    const column = left.getFirstColumnName();\n\n    if (!column) return;\n\n    const leftValue =\n      left.rhs instanceof SqlLiteral\n        ? left.rhs.value\n        : left.lhs instanceof SqlLiteral\n        ? left.lhs.value\n        : undefined;\n    const rightValue =\n      right.rhs instanceof SqlLiteral\n        ? right.rhs.value\n        : right.lhs instanceof SqlLiteral\n        ? right.lhs.value\n        : undefined;\n\n    if (typeof leftValue !== 'number' || typeof rightValue !== 'number') return;\n    if (isNaN(leftValue) || isNaN(rightValue)) return;\n\n    return {\n      type: 'numberRange',\n      column,\n      negated,\n      start: leftValue,\n      end: rightValue,\n      startBound: left.op === '>' ? '(' : '[',\n      endBound: right.op === '<' ? ')' : ']',\n    };\n  },\n  isValid(_pattern): boolean {\n    return true;\n  },\n  toExpression(pattern): SqlExpression {\n    const c = C(pattern.column);\n\n    if (pattern.end == null && pattern.start != null) {\n      return pattern.startBound === '('\n        ? SqlComparison.greaterThan(c, L(pattern.start))\n        : SqlComparison.greaterThanOrEqual(c, L(pattern.start)).applyIf(pattern.negated, ex =>\n            ex.negate(),\n          );\n    }\n\n    if (pattern.start == null && pattern.end != null) {\n      return pattern.endBound === ')'\n        ? SqlComparison.lessThan(c, L(pattern.end))\n        : SqlComparison.lessThanOrEqual(c, L(pattern.end)).applyIf(pattern.negated, ex =>\n            ex.negate(),\n          );\n    }\n\n    const start = pattern.start ?? 0;\n    const end = pattern.end ?? 1;\n\n    return SqlExpression.and(\n      pattern.startBound === '('\n        ? SqlComparison.greaterThan(c, L(start))\n        : SqlComparison.greaterThanOrEqual(c, L(start)),\n      pattern.endBound === ')'\n        ? SqlComparison.lessThan(c, L(end))\n        : SqlComparison.lessThanOrEqual(c, L(end)),\n    )\n      .ensureParens()\n      .applyIf(pattern.negated, ex => ex.negate());\n  },\n  getThing(_pattern): string | undefined {\n    return;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, F, L } from '../shortcuts';\nimport type { SqlExpression } from '../sql';\nimport { SqlColumn, SqlFunction, SqlLiteral } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { castAsVarchar, extractOuterNot, unwrapCastAsVarchar } from './common';\n\nexport interface RegexpFilterPattern {\n  type: 'regexp';\n  negated: boolean;\n  column: string;\n  regexp: string;\n}\n\nexport const REGEXP_PATTERN_DEFINITION: FilterPatternDefinition<RegexpFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    const [negated, ex] = extractOuterNot(possibleEx);\n    if (!(ex instanceof SqlFunction)) return;\n\n    const name = ex.getEffectiveFunctionName();\n    if (name !== 'REGEXP_LIKE') return;\n\n    let a0 = ex.getArg(0);\n    if (!a0) return;\n    a0 = unwrapCastAsVarchar(a0);\n    if (!(a0 instanceof SqlColumn)) return;\n\n    const a1 = ex.getArg(1);\n    if (!(a1 instanceof SqlLiteral)) return;\n\n    return {\n      type: 'regexp',\n      negated,\n      column: a0.getName(),\n      regexp: a1.value as string,\n    };\n  },\n  isValid(pattern): boolean {\n    return Boolean(pattern.regexp);\n  },\n  toExpression(pattern): SqlExpression {\n    return F('REGEXP_LIKE', castAsVarchar(C(pattern.column)), L(pattern.regexp)).applyIf(\n      pattern.negated,\n      ex => ex.negate(),\n    );\n  },\n  getThing(pattern): string | undefined {\n    return pattern.regexp;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, F, L } from '../shortcuts';\nimport type { SqlExpression } from '../sql';\nimport { SqlColumn, SqlComparison, SqlFunction, SqlLiteral, SqlMulti } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot } from './common';\n\nfunction invalidDate(date: Date): boolean {\n  return isNaN(date.valueOf());\n}\n\nexport interface TimeIntervalFilterPattern {\n  type: 'timeInterval';\n  negated: boolean;\n  column: string;\n  start: Date;\n  end: Date;\n  startBound: '(' | '[';\n  endBound: ')' | ']';\n}\n\n/**\n * Returns the decomposed comparison if the expression is a comparison with a column and a literal\n * Handles column on the left and literal on the right and vice versa\n *\n * @param expression the expression to decompose\n */\nfunction decomposeComparison(expression: SqlExpression | undefined) {\n  if (!(expression instanceof SqlComparison)) return;\n\n  if (!['<', '<='].includes(expression.op)) return;\n\n  // TIMESTAMP '2022-06-30 22:56:14.123' <= \"__time\"\n  if (expression.lhs instanceof SqlLiteral && expression.rhs instanceof SqlColumn) {\n    return {\n      column: expression.rhs,\n      value: expression.lhs,\n      // not using SqlComparison.reverseOperator here because\n      // it transforms '<' to '>=' and we need '>'\n      op: expression.op === '<' ? '>' : '>=',\n    };\n  }\n\n  // \"__time\" <= TIMESTAMP '2022-06-30 22:56:14.123'\n  if (expression.lhs instanceof SqlColumn && expression.rhs instanceof SqlLiteral) {\n    return {\n      column: expression.lhs,\n      value: expression.rhs,\n      op: expression.op,\n    };\n  }\n\n  return undefined;\n}\n\nexport const TIME_INTERVAL_PATTERN_DEFINITION: FilterPatternDefinition<TimeIntervalFilterPattern> =\n  {\n    fit(possibleEx: SqlExpression) {\n      // Something like\n      // TIME_IN_INTERVAL(\"lol\", '2022-06-30T22:56:14.123Z/2022-06-30T22:56:15.923Z')\n      // TIMESTAMP '2022-06-30 22:56:14.123' <= \"__time\" AND \"__time\" >= TIMESTAMP '2022-06-30 22:56:15.923'\n\n      const [negated, ex] = extractOuterNot(possibleEx);\n\n      if (ex instanceof SqlMulti && ex.op === 'AND') {\n        const args = ex.getArgArray();\n        if (args.length !== 2) return;\n\n        const start = args[0];\n        const end = args[1];\n\n        const decomposedStart = decomposeComparison(start);\n        const decomposedEnd = decomposeComparison(end);\n        if (!decomposedStart || !decomposedEnd) return;\n\n        const { column: startColumn, value: startLiteral, op: startOp } = decomposedStart;\n        const { column: endColumn, value: endLiteral, op: endOp } = decomposedEnd;\n\n        if (!(startLiteral instanceof SqlLiteral) || !(endLiteral instanceof SqlLiteral)) return;\n\n        const startValue = startLiteral.value;\n        if (!(startValue instanceof Date)) return;\n\n        const endValue = endLiteral.value;\n        if (!(endValue instanceof Date)) return;\n\n        if (startColumn.getName() !== endColumn.getName()) return;\n\n        return {\n          type: 'timeInterval',\n          negated,\n          column: startColumn.getName(),\n          start: startValue,\n          end: endValue,\n          startBound: startOp === '>' ? '(' : '[',\n          endBound: endOp === '<' ? ')' : ']',\n        };\n      }\n\n      if (!(ex instanceof SqlFunction)) return;\n\n      const name = ex.getEffectiveFunctionName();\n      if (name !== 'TIME_IN_INTERVAL') return;\n\n      const a0 = ex.getArg(0);\n      if (!(a0 instanceof SqlColumn)) return;\n\n      const a1 = ex.getArgAsString(1);\n      if (!a1) return;\n\n      const intervalParts = a1.split('/');\n      if (intervalParts.length !== 2) return;\n\n      const start = new Date(intervalParts[0]!);\n      if (invalidDate(start)) return;\n\n      const end = new Date(intervalParts[1]!);\n      if (invalidDate(end)) return;\n\n      return {\n        type: 'timeInterval',\n        negated,\n        column: a0.getName(),\n        start,\n        end,\n        startBound: '[',\n        endBound: ')',\n      };\n    },\n    isValid(_pattern): boolean {\n      return true;\n    },\n    toExpression(pattern): SqlExpression {\n      // TIME_IN_INTERVAL assumes the interval is closed on the start and open on the end\n      // so we need to handle other cases here with a regular AND\n      if (pattern.startBound !== '[' || pattern.endBound !== ')') {\n        return SqlLiteral.create(pattern.start)\n          .applyIf(pattern.startBound === '[', c => c.lessThanOrEqual(C(pattern.column)))\n          .applyIf(pattern.startBound === '(', c => c.lessThan(C(pattern.column)))\n          .and(\n            SqlColumn.create(pattern.column)\n              .applyIf(pattern.endBound === ']', c => c.lessThanOrEqual(pattern.end))\n              .applyIf(pattern.endBound === ')', c => c.lessThan(pattern.end)),\n          );\n      }\n\n      return F(\n        'TIME_IN_INTERVAL',\n        C(pattern.column),\n        L(`${pattern.start.toISOString()}/${pattern.end.toISOString()}`),\n      ).applyIf(pattern.negated, ex => ex.negate());\n    },\n    getThing(_pattern): string | undefined {\n      return;\n    },\n  };\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C, F, L } from '../shortcuts';\nimport {\n  RefName,\n  SqlColumn,\n  SqlComparison,\n  SqlExpression,\n  SqlFunction,\n  SqlLiteral,\n  SqlMulti,\n} from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot, oneOf } from './common';\n\nexport interface TimeRelativeFilterPattern {\n  type: 'timeRelative';\n  negated: boolean;\n  column: string;\n  anchor: 'timestamp' | 'maxDataTime';\n  anchorTimestamp?: Date;\n  rangeDuration: string;\n  rangeStep?: number;\n  alignType?: 'floor' | 'ceil';\n  alignDuration?: string;\n  shiftDuration?: string;\n  shiftStep?: number;\n  timezone?: string;\n  origin?: string;\n  startBound: '(' | '[';\n  endBound: ')' | ']';\n}\n\nfunction getAnchor(pattern: TimeRelativeFilterPattern) {\n  if (pattern.anchor === 'timestamp') {\n    if (pattern.anchorTimestamp) {\n      return L(pattern.anchorTimestamp);\n    } else {\n      return new SqlFunction({\n        functionName: new RefName({ name: 'CURRENT_TIMESTAMP', quotes: false }),\n        specialParen: 'none',\n      });\n    }\n  } else {\n    return new SqlFunction({\n      functionName: new RefName({ name: 'MAX_DATA_TIME', quotes: false }),\n    });\n  }\n}\n\nexport const TIME_RELATIVE_PATTERN_DEFINITION: FilterPatternDefinition<TimeRelativeFilterPattern> =\n  {\n    fit(possibleEx: SqlExpression) {\n      // Something like\n      // TIME_SHIFT(CURRENT_TIMESTAMP, 'PT1H', -1) <= __time AND __time < CURRENT_TIMESTAMP\n      // CURRENT_TIMESTAMP <= __time AND __time < TIME_SHIFT(CURRENT_TIMESTAMP, 'PT1H', 1)\n      // TIME_SHIFT(CURRENT_TIMESTAMP, 'PT1H', -1, 'Etc/UTC') <= __time AND __time < CURRENT_TIMESTAMP\n      // TIME_SHIFT(TIME_CEIL(CURRENT_TIMESTAMP, 'P1D'), 'PT1H', -1) <= __time AND __time < TIME_CEIL(CURRENT_TIMESTAMP, 'P1D')\n      // TIME_SHIFT(TIME_SHIFT(TIME_CEIL(CURRENT_TIMESTAMP, 'P1D'), 'P1D', -1), 'PT1H', -1) <= __time AND __time < TIME_SHIFT(TIME_CEIL(CURRENT_TIMESTAMP, 'P1D'), 'P1D', -1)\n      const [negated, ex] = extractOuterNot(possibleEx);\n\n      if (!(ex instanceof SqlMulti) || ex.numArgs() !== 2) return;\n\n      const a = ex.getArg(0);\n      if (!(a instanceof SqlComparison) || (a.op !== '<=' && a.op !== '<')) return;\n\n      const b = ex.getArg(1);\n      if (!(b instanceof SqlComparison) || (b.op !== '<' && b.op !== '<=')) return;\n\n      const startBound = a.op === '<=' ? '[' : '(';\n      const endBound = b.op === '<' ? ')' : ']';\n\n      // Check that we use the same column in both comparisons\n      const columnRef = a.rhs;\n      if (!(columnRef instanceof SqlColumn) || !columnRef.equals(b.lhs)) return;\n\n      // Fit the outer timeShift it could be in a.lhs OR b.rhs\n      // a.lhs <= columnRef AND columnRef < b.rhs\n\n      let timeShift: SqlFunction;\n      let anchorEx: SqlExpression | undefined;\n      let rangeStep: number;\n      if (a.lhs instanceof SqlFunction && a.lhs.getEffectiveFunctionName() === 'TIME_SHIFT') {\n        timeShift = a.lhs;\n        anchorEx = timeShift.getArg(0);\n        if (!b.rhs.equals(anchorEx)) return;\n\n        rangeStep = -timeShift.getArgAsNumber(2)!;\n        if (!(rangeStep > 0)) return;\n      } else if (\n        b.rhs instanceof SqlFunction &&\n        b.rhs.getEffectiveFunctionName() === 'TIME_SHIFT'\n      ) {\n        timeShift = b.rhs;\n        anchorEx = timeShift.getArg(0);\n        if (!a.lhs.equals(anchorEx)) return;\n\n        rangeStep = -timeShift.getArgAsNumber(2)!;\n        if (!(rangeStep < 0)) return;\n      } else {\n        return;\n      }\n\n      const rangeDuration = timeShift.getArgAsString(1);\n      if (!rangeDuration) return;\n\n      const timezone = timeShift.getArgAsString(3);\n\n      let origin;\n\n      let shiftDuration: string | undefined;\n      let shiftStep: number | undefined;\n      if (anchorEx instanceof SqlFunction && anchorEx.getEffectiveFunctionName() === 'TIME_SHIFT') {\n        shiftDuration = anchorEx.getArgAsString(1);\n        if (!shiftDuration) return;\n\n        shiftStep = anchorEx.getArgAsNumber(2);\n        if (!shiftStep) return;\n\n        if (anchorEx.getArgAsString(3) !== timezone) return;\n\n        anchorEx = anchorEx.getArg(0);\n      }\n\n      let alignType: 'floor' | 'ceil' | undefined;\n      let alignDuration: string | undefined;\n      if (\n        anchorEx instanceof SqlFunction &&\n        oneOf(anchorEx.getEffectiveFunctionName(), 'TIME_FLOOR', 'TIME_CEIL')\n      ) {\n        alignType = anchorEx.getEffectiveFunctionName() === 'TIME_FLOOR' ? 'floor' : 'ceil';\n\n        alignDuration = anchorEx.getArgAsString(1);\n        if (!alignDuration) return;\n\n        if (anchorEx.getArgAsString(3) !== timezone) return;\n        origin = anchorEx.getArgAsString(2);\n\n        anchorEx = anchorEx.getArg(0);\n      }\n\n      let anchor: TimeRelativeFilterPattern['anchor'];\n      let anchorTimestamp: Date | undefined;\n      if (anchorEx instanceof SqlFunction) {\n        switch (anchorEx.getEffectiveFunctionName()) {\n          case 'CURRENT_TIMESTAMP':\n            anchor = 'timestamp';\n            break;\n\n          case 'MAX_DATA_TIME':\n            anchor = 'maxDataTime';\n            break;\n\n          default:\n            return;\n        }\n      } else if (anchorEx instanceof SqlLiteral) {\n        anchorTimestamp = anchorEx.getDateValue();\n        if (!anchorTimestamp) return;\n        anchor = 'timestamp';\n      } else {\n        return;\n      }\n\n      const result: TimeRelativeFilterPattern = {\n        type: 'timeRelative',\n        negated,\n        column: columnRef.getName(),\n        anchor,\n        rangeDuration,\n        startBound,\n        endBound,\n      };\n\n      if (anchorTimestamp !== undefined) result.anchorTimestamp = anchorTimestamp;\n      if (rangeStep !== 1) result.rangeStep = rangeStep;\n      if (alignDuration !== undefined) result.alignDuration = alignDuration;\n      if (alignType !== undefined) result.alignType = alignType;\n      if (shiftDuration !== undefined) result.shiftDuration = shiftDuration;\n      if (shiftStep !== undefined) result.shiftStep = shiftStep;\n      if (timezone !== undefined) result.timezone = timezone;\n      if (origin !== undefined) result.origin = origin;\n\n      return result;\n    },\n    isValid(_pattern): boolean {\n      return true;\n    },\n    toExpression(pattern): SqlExpression {\n      let anchor = getAnchor(pattern);\n\n      if (pattern.alignType && pattern.alignDuration) {\n        anchor = F(\n          pattern.alignType === 'floor' ? 'TIME_FLOOR' : 'TIME_CEIL',\n          anchor,\n          pattern.alignDuration,\n          // Origin is required if a timezone is included\n          // passing null will appear in the arguments as NULL\n          // undefined will not appear in the list of arguments.\n          pattern.timezone ? pattern.origin || null : undefined,\n          pattern.timezone,\n        );\n      }\n\n      if (pattern.shiftDuration && pattern.shiftStep) {\n        anchor = F.timeShift(anchor, pattern.shiftDuration, pattern.shiftStep, pattern.timezone);\n      }\n\n      const rangeStep = pattern.rangeStep || 1;\n      const anchorWithRange = F.timeShift(\n        anchor,\n        pattern.rangeDuration,\n        -rangeStep,\n        pattern.timezone,\n      );\n\n      const start = rangeStep >= 0 ? anchorWithRange : anchor;\n      const end = rangeStep < 0 ? anchorWithRange : anchor;\n      const column = C(pattern.column);\n      return SqlExpression.and(\n        pattern.startBound === '[' ? start.lessThanOrEqual(column) : start.lessThan(column),\n        pattern.endBound === ']' ? column.lessThanOrEqual(end) : column.lessThan(end),\n      )\n        .ensureParens()\n        .applyIf(pattern.negated, ex => ex.negate());\n    },\n    getThing(_pattern): string | undefined {\n      return;\n    },\n  };\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { C } from '../shortcuts';\nimport type { LiteralValue, SqlExpression } from '../sql';\nimport { SqlColumn, SqlComparison, SqlLiteral, SqlMulti, SqlPlaceholder, SqlRecord } from '../sql';\nimport { filterMap } from '../utils';\n\nimport type { FilterPatternDefinition } from './common';\nimport { extractOuterNot, sqlRecordGetLiteralValues, xor } from './common';\n\nexport interface ValuesFilterPattern {\n  type: 'values';\n  negated: boolean;\n  column: string;\n  values: LiteralValue[];\n}\n\nexport const VALUES_PATTERN_DEFINITION: FilterPatternDefinition<ValuesFilterPattern> = {\n  fit(possibleEx: SqlExpression) {\n    const [negated, ex] = extractOuterNot(possibleEx);\n\n    if (ex instanceof SqlMulti && (ex.op === 'OR' || ex.op === 'AND')) {\n      const args = ex.getArgArray();\n      const patterns = filterMap(args, VALUES_PATTERN_DEFINITION.fit);\n\n      const pattern = patterns[0];\n      if (pattern && args.length === patterns.length) {\n        if (pattern.negated && ex.op === 'OR') {\n          return;\n        }\n\n        if (!pattern.negated && ex.op === 'AND') {\n          return;\n        }\n\n        for (const p of patterns.slice(1)) {\n          if (!p || p.negated !== pattern.negated || p.column !== pattern.column) {\n            return;\n          }\n\n          pattern.values.push(...p.values);\n        }\n\n        return pattern;\n      }\n    }\n\n    if (!(ex instanceof SqlComparison)) return;\n\n    const { lhs, rhs, op } = ex;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (op) {\n      case '=':\n      case '<>':\n        if (lhs instanceof SqlColumn && rhs instanceof SqlLiteral) {\n          return {\n            type: 'values',\n            negated: xor(op === '<>', negated),\n            column: lhs.getName(),\n            values: [rhs.value],\n          };\n        } else if (lhs instanceof SqlLiteral && rhs instanceof SqlColumn) {\n          return {\n            type: 'values',\n            negated: xor(op === '<>', negated),\n            column: rhs.getName(),\n            values: [lhs.value],\n          };\n        }\n        return;\n\n      case 'IS':\n      case 'IS NOT':\n        if (lhs instanceof SqlColumn && rhs instanceof SqlLiteral) {\n          return {\n            type: 'values',\n            negated: xor(op === 'IS NOT', negated),\n            column: lhs.getName(),\n            values: [rhs.value],\n          };\n        }\n        return;\n\n      case 'IN':\n      case 'NOT IN':\n        if (lhs instanceof SqlColumn && rhs instanceof SqlRecord) {\n          const values = sqlRecordGetLiteralValues(rhs);\n          if (values) {\n            return {\n              type: 'values',\n              negated: xor(ex.hasNot(), negated),\n              column: lhs.getName(),\n              values,\n            };\n          }\n        }\n        return;\n\n      default:\n        return;\n    }\n  },\n  isValid(pattern) {\n    return Array.isArray(pattern.values) && Boolean(pattern.values.length);\n  },\n  toExpression({ column, values, negated }): SqlExpression {\n    if (!values.length) return SqlLiteral.FALSE;\n\n    return C(column).apply(ex => {\n      if (values.length === 1) {\n        if (values[0] === null) {\n          return negated ? ex.isNotNull() : ex.isNull();\n        }\n\n        return ex\n          .equal(values[0] ?? SqlPlaceholder.PLACEHOLDER)\n          .applyIf(negated, ex => ex.negate());\n      } else {\n        if (values.includes(null)) {\n          if (negated) {\n            return ex\n              .isNotNull()\n              .and(ex.notIn(values.filter(v => v !== null)))\n              .addParens();\n          }\n          return ex\n            .isNull()\n            .or(ex.in(values.filter(v => v !== null)))\n            .addParens();\n        }\n\n        return ex.in(values).applyIf(negated, ex => ex.negate());\n      }\n    });\n  },\n  getThing(pattern) {\n    return pattern.values.length ? String(pattern.values[0]) : undefined;\n  },\n};\n","/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SqlExpression } from '../sql';\n\nimport type { FilterPatternDefinition } from './common';\nimport type { ContainsFilterPattern } from './pattern-contains';\nimport { CONTAINS_PATTERN_DEFINITION } from './pattern-contains';\nimport type { CustomFilterPattern } from './pattern-custom';\nimport { CUSTOM_PATTERN_DEFINITION } from './pattern-custom';\nimport type { MvContainsFilterPattern } from './pattern-mv-contains';\nimport { MV_CONTAINS_PATTERN_DEFINITION } from './pattern-mv-contains';\nimport type { NumberRangeFilterPattern } from './pattern-number-range';\nimport { NUMBER_RANGE_PATTERN_DEFINITION } from './pattern-number-range';\nimport type { RegexpFilterPattern } from './pattern-regexp';\nimport { REGEXP_PATTERN_DEFINITION } from './pattern-regexp';\nimport type { TimeIntervalFilterPattern } from './pattern-time-interval';\nimport { TIME_INTERVAL_PATTERN_DEFINITION } from './pattern-time-interval';\nimport type { TimeRelativeFilterPattern } from './pattern-time-relative';\nimport { TIME_RELATIVE_PATTERN_DEFINITION } from './pattern-time-relative';\nimport type { ValuesFilterPattern } from './pattern-values';\nimport { VALUES_PATTERN_DEFINITION } from './pattern-values';\n\nexport type FilterPattern =\n  | ValuesFilterPattern\n  | ContainsFilterPattern\n  | RegexpFilterPattern\n  | TimeIntervalFilterPattern\n  | TimeRelativeFilterPattern\n  | NumberRangeFilterPattern\n  | MvContainsFilterPattern\n  | CustomFilterPattern;\n\nexport type FilterPatternType = FilterPattern['type'];\n\nexport const FILTER_PATTERN_TYPES: FilterPatternType[] = [\n  'values',\n  'contains',\n  'regexp',\n  'timeInterval',\n  'timeRelative',\n  'numberRange',\n  'mvContains',\n  'custom',\n];\n\nconst TYPE_TO_DESCRIPTION: Record<FilterPatternType, FilterPatternDefinition<any>> = {\n  values: VALUES_PATTERN_DEFINITION,\n  contains: CONTAINS_PATTERN_DEFINITION,\n  regexp: REGEXP_PATTERN_DEFINITION,\n  timeInterval: TIME_INTERVAL_PATTERN_DEFINITION,\n  timeRelative: TIME_RELATIVE_PATTERN_DEFINITION,\n  numberRange: NUMBER_RANGE_PATTERN_DEFINITION,\n  mvContains: MV_CONTAINS_PATTERN_DEFINITION,\n  custom: CUSTOM_PATTERN_DEFINITION,\n};\n\nexport function fitFilterPatterns(ex: SqlExpression): FilterPattern[] {\n  // Check if the entire expression can fit a single pattern\n  const wholeFit = fitFilterPattern(ex);\n  if (wholeFit.type !== 'custom') return [wholeFit];\n\n  return ex.decomposeViaAnd({ flatten: false }).map(fitFilterPattern);\n}\n\nexport function fitFilterPattern(ex: SqlExpression): FilterPattern {\n  for (const type of FILTER_PATTERN_TYPES) {\n    const pattern = TYPE_TO_DESCRIPTION[type].fit(ex);\n    if (pattern) return pattern;\n  }\n  return {\n    type: 'custom',\n    negated: false,\n    expression: ex,\n  };\n}\n\nexport function filterPatternsToExpression(patterns: FilterPattern[]): SqlExpression {\n  return SqlExpression.and(...patterns.map(filterPatternToExpression));\n}\n\nexport function filterPatternToExpression(pattern: FilterPattern): SqlExpression {\n  return TYPE_TO_DESCRIPTION[pattern.type].toExpression(pattern);\n}\n\nfunction getColumnFromPattern(pattern: FilterPattern): string | undefined {\n  if (pattern.type === 'custom') {\n    return pattern.expression?.getFirstColumnName();\n  } else {\n    return pattern.column;\n  }\n}\n\nfunction getThingFromPattern(pattern: FilterPattern): string | undefined {\n  return TYPE_TO_DESCRIPTION[pattern.type].getThing(pattern);\n}\n\nexport function changeFilterPatternType(\n  pattern: FilterPattern,\n  newType: FilterPatternType,\n): FilterPattern {\n  const column = getColumnFromPattern(pattern);\n  const thing = getThingFromPattern(pattern);\n  switch (newType) {\n    case 'values':\n      return {\n        type: 'values',\n        negated: pattern.negated,\n        column: column || '?',\n        values: thing ? [thing] : [],\n      };\n\n    case 'contains':\n      return {\n        type: 'contains',\n        negated: pattern.negated,\n        column: column || '?',\n        contains: thing || '',\n      };\n\n    case 'regexp':\n      return {\n        type: 'regexp',\n        negated: pattern.negated,\n        column: column || '?',\n        regexp: thing || '',\n      };\n\n    case 'timeInterval':\n      return {\n        type: 'timeInterval',\n        negated: pattern.negated,\n        column: column || '?',\n        start: new Date('2020-01-01Z'),\n        end: new Date('2022-01-01Z'),\n        startBound: '[',\n        endBound: ')',\n      };\n\n    case 'timeRelative':\n      return {\n        type: 'timeRelative',\n        negated: pattern.negated,\n        column: column || '?',\n        anchor: 'timestamp',\n        rangeDuration: 'P1D',\n        startBound: '[',\n        endBound: ')',\n      };\n\n    case 'numberRange':\n      return {\n        type: 'numberRange',\n        negated: pattern.negated,\n        column: column || '?',\n        start: 0,\n        end: 100,\n        startBound: '(',\n        endBound: ')',\n      };\n\n    case 'mvContains':\n      return {\n        type: 'mvContains',\n        negated: pattern.negated,\n        column: column || '?',\n        values: thing ? [thing] : [],\n      };\n\n    case 'custom':\n      return {\n        type: 'custom',\n        negated: false,\n        expression: filterPatternToExpression(pattern),\n      };\n  }\n}\n"]}