sql-formatter-ggsrc-customized
Version:
Format whitespace in a SQL query to make it more readable
1 lines • 620 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/allDialects.ts","../src/expandPhrases.ts","../src/lexer/token.ts","../src/languages/bigquery/bigquery.functions.ts","../src/languages/bigquery/bigquery.keywords.ts","../src/languages/bigquery/bigquery.formatter.ts","../src/languages/db2/db2.functions.ts","../src/languages/db2/db2.keywords.ts","../src/languages/db2/db2.formatter.ts","../src/languages/db2i/db2i.functions.ts","../src/languages/db2i/db2i.keywords.ts","../src/languages/db2i/db2i.formatter.ts","../src/languages/hive/hive.functions.ts","../src/languages/hive/hive.keywords.ts","../src/languages/hive/hive.formatter.ts","../src/languages/mariadb/likeMariaDb.ts","../src/languages/mariadb/mariadb.keywords.ts","../src/languages/mariadb/mariadb.functions.ts","../src/languages/mariadb/mariadb.formatter.ts","../src/languages/mysql/mysql.keywords.ts","../src/languages/mysql/mysql.functions.ts","../src/languages/mysql/mysql.formatter.ts","../src/languages/tidb/tidb.keywords.ts","../src/languages/tidb/tidb.functions.ts","../src/languages/tidb/tidb.formatter.ts","../src/languages/n1ql/n1ql.functions.ts","../src/languages/n1ql/n1ql.keywords.ts","../src/languages/n1ql/n1ql.formatter.ts","../src/languages/plsql/plsql.keywords.ts","../src/languages/plsql/plsql.functions.ts","../src/languages/plsql/plsql.formatter.ts","../src/languages/postgresql/postgresql.functions.ts","../src/languages/postgresql/postgresql.keywords.ts","../src/languages/postgresql/postgresql.formatter.ts","../src/languages/redshift/redshift.functions.ts","../src/languages/redshift/redshift.keywords.ts","../src/languages/redshift/redshift.formatter.ts","../src/languages/spark/spark.keywords.ts","../src/languages/spark/spark.functions.ts","../src/languages/spark/spark.formatter.ts","../src/languages/sqlite/sqlite.functions.ts","../src/languages/sqlite/sqlite.keywords.ts","../src/languages/sqlite/sqlite.formatter.ts","../src/languages/sql/sql.functions.ts","../src/languages/sql/sql.keywords.ts","../src/languages/sql/sql.formatter.ts","../src/languages/trino/trino.functions.ts","../src/languages/trino/trino.keywords.ts","../src/languages/trino/trino.formatter.ts","../src/languages/transactsql/transactsql.functions.ts","../src/languages/transactsql/transactsql.keywords.ts","../src/languages/transactsql/transactsql.formatter.ts","../src/languages/singlestoredb/singlestoredb.keywords.ts","../src/languages/singlestoredb/singlestoredb.functions.ts","../src/languages/singlestoredb/singlestoredb.formatter.ts","../src/languages/snowflake/snowflake.functions.ts","../src/languages/snowflake/snowflake.keywords.ts","../src/languages/snowflake/snowflake.formatter.ts","../src/utils.ts","../src/lexer/regexUtil.ts","../src/lexer/regexFactory.ts","../src/lexer/lineColFromIndex.ts","../src/lexer/TokenizerEngine.ts","../src/lexer/NestedComment.ts","../src/lexer/Tokenizer.ts","../src/dialect.ts","../src/formatter/config.ts","../src/formatter/Params.ts","../src/parser/createParser.ts","../src/lexer/disambiguateTokens.ts","../src/parser/LexerAdapter.ts","../src/parser/grammar.ts","../src/formatter/Layout.ts","../src/formatter/tabularStyle.ts","../src/formatter/Indentation.ts","../src/formatter/InlineLayout.ts","../src/formatter/ExpressionFormatter.ts","../src/formatter/Formatter.ts","../src/validateConfig.ts","../src/sqlFormatter.ts"],"sourcesContent":["export { supportedDialects, format, formatDialect } from './sqlFormatter.js';\nexport { expandPhrases } from './expandPhrases.js';\nexport { ConfigError } from './validateConfig.js';\n\n// When adding a new dialect, be sure to add it to the list of exports below.\nexport { bigquery } from './languages/bigquery/bigquery.formatter.js';\nexport { db2 } from './languages/db2/db2.formatter.js';\nexport { db2i } from './languages/db2i/db2i.formatter.js';\nexport { hive } from './languages/hive/hive.formatter.js';\nexport { mariadb } from './languages/mariadb/mariadb.formatter.js';\nexport { mysql } from './languages/mysql/mysql.formatter.js';\nexport { tidb } from './languages/tidb/tidb.formatter.js';\nexport { n1ql } from './languages/n1ql/n1ql.formatter.js';\nexport { plsql } from './languages/plsql/plsql.formatter.js';\nexport { postgresql } from './languages/postgresql/postgresql.formatter.js';\nexport { redshift } from './languages/redshift/redshift.formatter.js';\nexport { spark } from './languages/spark/spark.formatter.js';\nexport { sqlite } from './languages/sqlite/sqlite.formatter.js';\nexport { sql } from './languages/sql/sql.formatter.js';\nexport { trino } from './languages/trino/trino.formatter.js';\nexport { transactsql } from './languages/transactsql/transactsql.formatter.js';\nexport { singlestoredb } from './languages/singlestoredb/singlestoredb.formatter.js';\nexport { snowflake } from './languages/snowflake/snowflake.formatter.js';\n\n// NB! To re-export types the \"export type\" syntax is required by webpack.\n// Otherwise webpack build will fail.\nexport type {\n SqlLanguage,\n FormatOptionsWithLanguage,\n FormatOptionsWithDialect,\n} from './sqlFormatter.js';\nexport type {\n IndentStyle,\n KeywordCase,\n DataTypeCase,\n FunctionCase,\n IdentifierCase,\n LogicalOperatorNewline,\n FormatOptions,\n} from './FormatOptions.js';\nexport type { ParamItems } from './formatter/Params.js';\nexport type { ParamTypes } from './lexer/TokenizerOptions.js';\nexport type { DialectOptions } from './dialect.js';\n","export { bigquery } from './languages/bigquery/bigquery.formatter.js';\nexport { db2 } from './languages/db2/db2.formatter.js';\nexport { db2i } from './languages/db2i/db2i.formatter.js';\nexport { hive } from './languages/hive/hive.formatter.js';\nexport { mariadb } from './languages/mariadb/mariadb.formatter.js';\nexport { mysql } from './languages/mysql/mysql.formatter.js';\nexport { tidb } from './languages/tidb/tidb.formatter.js';\nexport { n1ql } from './languages/n1ql/n1ql.formatter.js';\nexport { plsql } from './languages/plsql/plsql.formatter.js';\nexport { postgresql } from './languages/postgresql/postgresql.formatter.js';\nexport { redshift } from './languages/redshift/redshift.formatter.js';\nexport { spark } from './languages/spark/spark.formatter.js';\nexport { sqlite } from './languages/sqlite/sqlite.formatter.js';\nexport { sql } from './languages/sql/sql.formatter.js';\nexport { trino } from './languages/trino/trino.formatter.js';\nexport { transactsql } from './languages/transactsql/transactsql.formatter.js';\nexport { singlestoredb } from './languages/singlestoredb/singlestoredb.formatter.js';\nexport { snowflake } from './languages/snowflake/snowflake.formatter.js';\n","/**\n * Performs expandSinglePhrase() on array\n */\nexport const expandPhrases = (phrases: string[]): string[] => phrases.flatMap(expandSinglePhrase);\n\n/**\n * Expands a syntax description like\n *\n * \"CREATE [OR REPLACE] [TEMP|TEMPORARY] TABLE\"\n *\n * into an array of all possible combinations like:\n *\n * [ \"CREATE TABLE\",\n * \"CREATE TEMP TABLE\",\n * \"CREATE TEMPORARY TABLE\",\n * \"CREATE OR REPLACE TABLE\",\n * \"CREATE OR REPLACE TEMP TABLE\",\n * \"CREATE OR REPLACE TEMPORARY TABLE\" ]\n *\n * The [] and {} parenthesis can also be nested like\n *\n * \"FOR [OF {UNIQUE | MANDATORY} TABLES]\"\n *\n * resulting in:\n *\n * [ \"FOR\",\n * \"FOR OF UNIQUE TABLES\",\n * \"FOR OF MANDATORY TABLES\" ]\n */\nexport const expandSinglePhrase = (phrase: string): string[] =>\n buildCombinations(parsePhrase(phrase)).map(stripExtraWhitespace);\n\nconst stripExtraWhitespace = (text: string) => text.replace(/ +/g, ' ').trim();\n\nconst parsePhrase = (text: string): Phrase => ({\n type: 'mandatory_block',\n items: parseAlteration(text, 0)[0],\n});\n\ntype Phrase = string | MandatoryBlock | OptionalBlock | Concatenation;\ntype Concatenation = { type: 'concatenation'; items: Phrase[] };\ntype MandatoryBlock = { type: 'mandatory_block'; items: Phrase[] };\ntype OptionalBlock = { type: 'optional_block'; items: Phrase[] };\n\nconst parseAlteration = (\n text: string,\n index: number,\n expectClosing?: ']' | '}'\n): [Phrase[], number] => {\n const alterations: Phrase[] = [];\n while (text[index]) {\n const [term, newIndex] = parseConcatenation(text, index);\n alterations.push(term);\n index = newIndex;\n if (text[index] === '|') {\n index++;\n } else if (text[index] === '}' || text[index] === ']') {\n if (expectClosing !== text[index]) {\n throw new Error(`Unbalanced parenthesis in: ${text}`);\n }\n index++;\n return [alterations, index];\n } else if (index === text.length) {\n if (expectClosing) {\n throw new Error(`Unbalanced parenthesis in: ${text}`);\n }\n return [alterations, index];\n } else {\n throw new Error(`Unexpected \"${text[index]}\"`);\n }\n }\n return [alterations, index];\n};\n\nconst parseConcatenation = (text: string, index: number): [Phrase, number] => {\n const items: Phrase[] = [];\n while (true) {\n const [term, newIndex] = parseTerm(text, index);\n if (term) {\n items.push(term);\n index = newIndex;\n } else {\n break;\n }\n }\n return items.length === 1 ? [items[0], index] : [{ type: 'concatenation', items }, index];\n};\n\nconst parseTerm = (text: string, index: number): [Phrase, number] => {\n if (text[index] === '{') {\n return parseMandatoryBlock(text, index + 1);\n } else if (text[index] === '[') {\n return parseOptionalBlock(text, index + 1);\n } else {\n let word = '';\n while (text[index] && /[A-Za-z0-9_ ]/.test(text[index])) {\n word += text[index];\n index++;\n }\n return [word, index];\n }\n};\n\nconst parseMandatoryBlock = (text: string, index: number): [MandatoryBlock, number] => {\n const [items, newIndex] = parseAlteration(text, index, '}');\n return [{ type: 'mandatory_block', items }, newIndex];\n};\n\nconst parseOptionalBlock = (text: string, index: number): [OptionalBlock, number] => {\n const [items, newIndex] = parseAlteration(text, index, ']');\n return [{ type: 'optional_block', items }, newIndex];\n};\n\nconst buildCombinations = (node: Phrase): string[] => {\n if (typeof node === 'string') {\n return [node];\n } else if (node.type === 'concatenation') {\n return node.items.map(buildCombinations).reduce(stringCombinations, ['']);\n } else if (node.type === 'mandatory_block') {\n return node.items.flatMap(buildCombinations);\n } else if (node.type === 'optional_block') {\n return ['', ...node.items.flatMap(buildCombinations)];\n } else {\n throw new Error(`Unknown node type: ${node}`);\n }\n};\n\nconst stringCombinations = (xs: string[], ys: string[]): string[] => {\n const results: string[] = [];\n for (const x of xs) {\n for (const y of ys) {\n results.push(x + y);\n }\n }\n return results;\n};\n","/** Token type enum for all possible Token categories */\nexport enum TokenType {\n QUOTED_IDENTIFIER = 'QUOTED_IDENTIFIER',\n IDENTIFIER = 'IDENTIFIER',\n STRING = 'STRING',\n VARIABLE = 'VARIABLE',\n RESERVED_DATA_TYPE = 'RESERVED_DATA_TYPE',\n RESERVED_PARAMETERIZED_DATA_TYPE = 'RESERVED_PARAMETERIZED_DATA_TYPE',\n RESERVED_KEYWORD = 'RESERVED_KEYWORD',\n RESERVED_FUNCTION_NAME = 'RESERVED_FUNCTION_NAME',\n RESERVED_PHRASE = 'RESERVED_PHRASE',\n RESERVED_SET_OPERATION = 'RESERVED_SET_OPERATION',\n RESERVED_CLAUSE = 'RESERVED_CLAUSE',\n RESERVED_SELECT = 'RESERVED_SELECT',\n RESERVED_JOIN = 'RESERVED_JOIN',\n ARRAY_IDENTIFIER = 'ARRAY_IDENTIFIER', // IDENTIFIER token in front of [\n ARRAY_KEYWORD = 'ARRAY_KEYWORD', // RESERVED_DATA_TYPE token in front of [\n CASE = 'CASE',\n END = 'END',\n WHEN = 'WHEN',\n ELSE = 'ELSE',\n THEN = 'THEN',\n LIMIT = 'LIMIT',\n BETWEEN = 'BETWEEN',\n AND = 'AND',\n OR = 'OR',\n XOR = 'XOR',\n OPERATOR = 'OPERATOR',\n COMMA = 'COMMA',\n ASTERISK = 'ASTERISK', // *\n PROPERTY_ACCESS_OPERATOR = 'PROPERTY_ACCESS_OPERATOR', // Usually \".\"\n OPEN_PAREN = 'OPEN_PAREN',\n CLOSE_PAREN = 'CLOSE_PAREN',\n LINE_COMMENT = 'LINE_COMMENT',\n BLOCK_COMMENT = 'BLOCK_COMMENT',\n // Text between /* sql-formatter-disable */ and /* sql-formatter-enable */\n DISABLE_COMMENT = 'DISABLE_COMMENT',\n NUMBER = 'NUMBER',\n NAMED_PARAMETER = 'NAMED_PARAMETER',\n QUOTED_PARAMETER = 'QUOTED_PARAMETER',\n NUMBERED_PARAMETER = 'NUMBERED_PARAMETER',\n POSITIONAL_PARAMETER = 'POSITIONAL_PARAMETER',\n CUSTOM_PARAMETER = 'CUSTOM_PARAMETER',\n DELIMITER = 'DELIMITER',\n EOF = 'EOF',\n}\n\n/** Struct to store the most basic cohesive unit of language grammar */\nexport interface Token {\n type: TokenType;\n raw: string; // The raw original text that was matched\n text: string; // Cleaned up text e.g. keyword converted to uppercase and extra spaces removed\n key?: string;\n start: number;\n precedingWhitespace?: string; // Whitespace before this token, if any\n}\n\n/** Creates EOF token positioned at given location */\nexport const createEofToken = (index: number) => ({\n type: TokenType.EOF,\n raw: '«EOF»',\n text: '«EOF»',\n start: index,\n});\n\n/**\n * For use as a \"missing token\"\n * e.g. in lookAhead and lookBehind to avoid dealing with null values\n */\nexport const EOF_TOKEN = createEofToken(Infinity);\n\n/** Checks if two tokens are equivalent */\nexport const testToken =\n (compareToken: { type: TokenType; text: string }) =>\n (token: Token): boolean =>\n token.type === compareToken.type && token.text === compareToken.text;\n\n/** Util object that allows for easy checking of Reserved Keywords */\nexport const isToken = {\n ARRAY: testToken({ text: 'ARRAY', type: TokenType.RESERVED_DATA_TYPE }),\n BY: testToken({ text: 'BY', type: TokenType.RESERVED_KEYWORD }),\n SET: testToken({ text: 'SET', type: TokenType.RESERVED_CLAUSE }),\n STRUCT: testToken({ text: 'STRUCT', type: TokenType.RESERVED_DATA_TYPE }),\n WINDOW: testToken({ text: 'WINDOW', type: TokenType.RESERVED_CLAUSE }),\n VALUES: testToken({ text: 'VALUES', type: TokenType.RESERVED_CLAUSE }),\n};\n\n/** Checks if token is any Reserved Keyword or Clause */\nexport const isReserved = (type: TokenType): boolean =>\n type === TokenType.RESERVED_DATA_TYPE ||\n type === TokenType.RESERVED_KEYWORD ||\n type === TokenType.RESERVED_FUNCTION_NAME ||\n type === TokenType.RESERVED_PHRASE ||\n type === TokenType.RESERVED_CLAUSE ||\n type === TokenType.RESERVED_SELECT ||\n type === TokenType.RESERVED_SET_OPERATION ||\n type === TokenType.RESERVED_JOIN ||\n type === TokenType.ARRAY_KEYWORD ||\n type === TokenType.CASE ||\n type === TokenType.END ||\n type === TokenType.WHEN ||\n type === TokenType.ELSE ||\n type === TokenType.THEN ||\n type === TokenType.LIMIT ||\n type === TokenType.BETWEEN ||\n type === TokenType.AND ||\n type === TokenType.OR ||\n type === TokenType.XOR;\n\nexport const isLogicalOperator = (type: TokenType): boolean =>\n type === TokenType.AND || type === TokenType.OR || type === TokenType.XOR;\n","export const functions: string[] = [\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/aead_encryption_functions\n 'KEYS.NEW_KEYSET',\n 'KEYS.ADD_KEY_FROM_RAW_BYTES',\n 'AEAD.DECRYPT_BYTES',\n 'AEAD.DECRYPT_STRING',\n 'AEAD.ENCRYPT',\n 'KEYS.KEYSET_CHAIN',\n 'KEYS.KEYSET_FROM_JSON',\n 'KEYS.KEYSET_TO_JSON',\n 'KEYS.ROTATE_KEYSET',\n 'KEYS.KEYSET_LENGTH',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_analytic_functions\n 'ANY_VALUE',\n 'ARRAY_AGG',\n 'AVG',\n 'CORR',\n 'COUNT',\n 'COUNTIF',\n 'COVAR_POP',\n 'COVAR_SAMP',\n 'MAX',\n 'MIN',\n 'ST_CLUSTERDBSCAN',\n 'STDDEV_POP',\n 'STDDEV_SAMP',\n 'STRING_AGG',\n 'SUM',\n 'VAR_POP',\n 'VAR_SAMP',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions\n 'ANY_VALUE',\n 'ARRAY_AGG',\n 'ARRAY_CONCAT_AGG',\n 'AVG',\n 'BIT_AND',\n 'BIT_OR',\n 'BIT_XOR',\n 'COUNT',\n 'COUNTIF',\n 'LOGICAL_AND',\n 'LOGICAL_OR',\n 'MAX',\n 'MIN',\n 'STRING_AGG',\n 'SUM',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions\n 'APPROX_COUNT_DISTINCT',\n 'APPROX_QUANTILES',\n 'APPROX_TOP_COUNT',\n 'APPROX_TOP_SUM',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions\n // 'ARRAY',\n 'ARRAY_CONCAT',\n 'ARRAY_LENGTH',\n 'ARRAY_TO_STRING',\n 'GENERATE_ARRAY',\n 'GENERATE_DATE_ARRAY',\n 'GENERATE_TIMESTAMP_ARRAY',\n 'ARRAY_REVERSE',\n 'OFFSET',\n 'SAFE_OFFSET',\n 'ORDINAL',\n 'SAFE_ORDINAL',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/bit_functions\n 'BIT_COUNT',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_functions\n // 'CASE',\n 'PARSE_BIGNUMERIC',\n 'PARSE_NUMERIC',\n 'SAFE_CAST',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions\n 'CURRENT_DATE',\n 'EXTRACT',\n 'DATE',\n 'DATE_ADD',\n 'DATE_SUB',\n 'DATE_DIFF',\n 'DATE_TRUNC',\n 'DATE_FROM_UNIX_DATE',\n 'FORMAT_DATE',\n 'LAST_DAY',\n 'PARSE_DATE',\n 'UNIX_DATE',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/datetime_functions\n 'CURRENT_DATETIME',\n 'DATETIME',\n 'EXTRACT',\n 'DATETIME_ADD',\n 'DATETIME_SUB',\n 'DATETIME_DIFF',\n 'DATETIME_TRUNC',\n 'FORMAT_DATETIME',\n 'LAST_DAY',\n 'PARSE_DATETIME',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/debugging_functions\n 'ERROR',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/federated_query_functions\n 'EXTERNAL_QUERY',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions\n 'S2_CELLIDFROMPOINT',\n 'S2_COVERINGCELLIDS',\n 'ST_ANGLE',\n 'ST_AREA',\n 'ST_ASBINARY',\n 'ST_ASGEOJSON',\n 'ST_ASTEXT',\n 'ST_AZIMUTH',\n 'ST_BOUNDARY',\n 'ST_BOUNDINGBOX',\n 'ST_BUFFER',\n 'ST_BUFFERWITHTOLERANCE',\n 'ST_CENTROID',\n 'ST_CENTROID_AGG',\n 'ST_CLOSESTPOINT',\n 'ST_CLUSTERDBSCAN',\n 'ST_CONTAINS',\n 'ST_CONVEXHULL',\n 'ST_COVEREDBY',\n 'ST_COVERS',\n 'ST_DIFFERENCE',\n 'ST_DIMENSION',\n 'ST_DISJOINT',\n 'ST_DISTANCE',\n 'ST_DUMP',\n 'ST_DWITHIN',\n 'ST_ENDPOINT',\n 'ST_EQUALS',\n 'ST_EXTENT',\n 'ST_EXTERIORRING',\n 'ST_GEOGFROM',\n 'ST_GEOGFROMGEOJSON',\n 'ST_GEOGFROMTEXT',\n 'ST_GEOGFROMWKB',\n 'ST_GEOGPOINT',\n 'ST_GEOGPOINTFROMGEOHASH',\n 'ST_GEOHASH',\n 'ST_GEOMETRYTYPE',\n 'ST_INTERIORRINGS',\n 'ST_INTERSECTION',\n 'ST_INTERSECTS',\n 'ST_INTERSECTSBOX',\n 'ST_ISCOLLECTION',\n 'ST_ISEMPTY',\n 'ST_LENGTH',\n 'ST_MAKELINE',\n 'ST_MAKEPOLYGON',\n 'ST_MAKEPOLYGONORIENTED',\n 'ST_MAXDISTANCE',\n 'ST_NPOINTS',\n 'ST_NUMGEOMETRIES',\n 'ST_NUMPOINTS',\n 'ST_PERIMETER',\n 'ST_POINTN',\n 'ST_SIMPLIFY',\n 'ST_SNAPTOGRID',\n 'ST_STARTPOINT',\n 'ST_TOUCHES',\n 'ST_UNION',\n 'ST_UNION_AGG',\n 'ST_WITHIN',\n 'ST_X',\n 'ST_Y',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/hash_functions\n 'FARM_FINGERPRINT',\n 'MD5',\n 'SHA1',\n 'SHA256',\n 'SHA512',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/hll_functions\n 'HLL_COUNT.INIT',\n 'HLL_COUNT.MERGE',\n 'HLL_COUNT.MERGE_PARTIAL',\n 'HLL_COUNT.EXTRACT',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions\n 'MAKE_INTERVAL',\n 'EXTRACT',\n 'JUSTIFY_DAYS',\n 'JUSTIFY_HOURS',\n 'JUSTIFY_INTERVAL',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions\n 'JSON_EXTRACT',\n 'JSON_QUERY',\n 'JSON_EXTRACT_SCALAR',\n 'JSON_VALUE',\n 'JSON_EXTRACT_ARRAY',\n 'JSON_QUERY_ARRAY',\n 'JSON_EXTRACT_STRING_ARRAY',\n 'JSON_VALUE_ARRAY',\n 'TO_JSON_STRING',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions\n 'ABS',\n 'SIGN',\n 'IS_INF',\n 'IS_NAN',\n 'IEEE_DIVIDE',\n 'RAND',\n 'SQRT',\n 'POW',\n 'POWER',\n 'EXP',\n 'LN',\n 'LOG',\n 'LOG10',\n 'GREATEST',\n 'LEAST',\n 'DIV',\n 'SAFE_DIVIDE',\n 'SAFE_MULTIPLY',\n 'SAFE_NEGATE',\n 'SAFE_ADD',\n 'SAFE_SUBTRACT',\n 'MOD',\n 'ROUND',\n 'TRUNC',\n 'CEIL',\n 'CEILING',\n 'FLOOR',\n 'COS',\n 'COSH',\n 'ACOS',\n 'ACOSH',\n 'SIN',\n 'SINH',\n 'ASIN',\n 'ASINH',\n 'TAN',\n 'TANH',\n 'ATAN',\n 'ATANH',\n 'ATAN2',\n 'RANGE_BUCKET',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/navigation_functions\n 'FIRST_VALUE',\n 'LAST_VALUE',\n 'NTH_VALUE',\n 'LEAD',\n 'LAG',\n 'PERCENTILE_CONT',\n 'PERCENTILE_DISC',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/net_functions\n 'NET.IP_FROM_STRING',\n 'NET.SAFE_IP_FROM_STRING',\n 'NET.IP_TO_STRING',\n 'NET.IP_NET_MASK',\n 'NET.IP_TRUNC',\n 'NET.IPV4_FROM_INT64',\n 'NET.IPV4_TO_INT64',\n 'NET.HOST',\n 'NET.PUBLIC_SUFFIX',\n 'NET.REG_DOMAIN',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/numbering_functions\n 'RANK',\n 'DENSE_RANK',\n 'PERCENT_RANK',\n 'CUME_DIST',\n 'NTILE',\n 'ROW_NUMBER',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/security_functions\n 'SESSION_USER',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/statistical_aggregate_functions\n 'CORR',\n 'COVAR_POP',\n 'COVAR_SAMP',\n 'STDDEV_POP',\n 'STDDEV_SAMP',\n 'STDDEV',\n 'VAR_POP',\n 'VAR_SAMP',\n 'VARIANCE',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions\n 'ASCII',\n 'BYTE_LENGTH',\n 'CHAR_LENGTH',\n 'CHARACTER_LENGTH',\n 'CHR',\n 'CODE_POINTS_TO_BYTES',\n 'CODE_POINTS_TO_STRING',\n 'CONCAT',\n 'CONTAINS_SUBSTR',\n 'ENDS_WITH',\n 'FORMAT',\n 'FROM_BASE32',\n 'FROM_BASE64',\n 'FROM_HEX',\n 'INITCAP',\n 'INSTR',\n 'LEFT',\n 'LENGTH',\n 'LPAD',\n 'LOWER',\n 'LTRIM',\n 'NORMALIZE',\n 'NORMALIZE_AND_CASEFOLD',\n 'OCTET_LENGTH',\n 'REGEXP_CONTAINS',\n 'REGEXP_EXTRACT',\n 'REGEXP_EXTRACT_ALL',\n 'REGEXP_INSTR',\n 'REGEXP_REPLACE',\n 'REGEXP_SUBSTR',\n 'REPLACE',\n 'REPEAT',\n 'REVERSE',\n 'RIGHT',\n 'RPAD',\n 'RTRIM',\n 'SAFE_CONVERT_BYTES_TO_STRING',\n 'SOUNDEX',\n 'SPLIT',\n 'STARTS_WITH',\n 'STRPOS',\n 'SUBSTR',\n 'SUBSTRING',\n 'TO_BASE32',\n 'TO_BASE64',\n 'TO_CODE_POINTS',\n 'TO_HEX',\n 'TRANSLATE',\n 'TRIM',\n 'UNICODE',\n 'UPPER',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/time_functions\n 'CURRENT_TIME',\n 'TIME',\n 'EXTRACT',\n 'TIME_ADD',\n 'TIME_SUB',\n 'TIME_DIFF',\n 'TIME_TRUNC',\n 'FORMAT_TIME',\n 'PARSE_TIME',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/timestamp_functions\n 'CURRENT_TIMESTAMP',\n 'EXTRACT',\n 'STRING',\n 'TIMESTAMP',\n 'TIMESTAMP_ADD',\n 'TIMESTAMP_SUB',\n 'TIMESTAMP_DIFF',\n 'TIMESTAMP_TRUNC',\n 'FORMAT_TIMESTAMP',\n 'PARSE_TIMESTAMP',\n 'TIMESTAMP_SECONDS',\n 'TIMESTAMP_MILLIS',\n 'TIMESTAMP_MICROS',\n 'UNIX_SECONDS',\n 'UNIX_MILLIS',\n 'UNIX_MICROS',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/uuid_functions\n 'GENERATE_UUID',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/conditional_expressions\n 'COALESCE',\n 'IF',\n 'IFNULL',\n 'NULLIF',\n\n // https://cloud.google.com/bigquery/docs/reference/legacy-sql\n // legacyAggregate\n 'AVG',\n 'BIT_AND',\n 'BIT_OR',\n 'BIT_XOR',\n 'CORR',\n 'COUNT',\n 'COVAR_POP',\n 'COVAR_SAMP',\n 'EXACT_COUNT_DISTINCT',\n 'FIRST',\n 'GROUP_CONCAT',\n 'GROUP_CONCAT_UNQUOTED',\n 'LAST',\n 'MAX',\n 'MIN',\n 'NEST',\n 'NTH',\n 'QUANTILES',\n 'STDDEV',\n 'STDDEV_POP',\n 'STDDEV_SAMP',\n 'SUM',\n 'TOP',\n 'UNIQUE',\n 'VARIANCE',\n 'VAR_POP',\n 'VAR_SAMP',\n\n // legacyBitwise\n 'BIT_COUNT',\n\n // legacyCasting\n 'BOOLEAN',\n 'BYTES',\n 'CAST',\n 'FLOAT',\n 'HEX_STRING',\n 'INTEGER',\n 'STRING',\n\n // legacyComparison\n // expr 'IN',\n 'COALESCE',\n 'GREATEST',\n 'IFNULL',\n 'IS_INF',\n 'IS_NAN',\n 'IS_EXPLICITLY_DEFINED',\n 'LEAST',\n 'NVL',\n\n // legacyDatetime\n 'CURRENT_DATE',\n 'CURRENT_TIME',\n 'CURRENT_TIMESTAMP',\n 'DATE',\n 'DATE_ADD',\n 'DATEDIFF',\n 'DAY',\n 'DAYOFWEEK',\n 'DAYOFYEAR',\n 'FORMAT_UTC_USEC',\n 'HOUR',\n 'MINUTE',\n 'MONTH',\n 'MSEC_TO_TIMESTAMP',\n 'NOW',\n 'PARSE_UTC_USEC',\n 'QUARTER',\n 'SEC_TO_TIMESTAMP',\n 'SECOND',\n 'STRFTIME_UTC_USEC',\n 'TIME',\n 'TIMESTAMP',\n 'TIMESTAMP_TO_MSEC',\n 'TIMESTAMP_TO_SEC',\n 'TIMESTAMP_TO_USEC',\n 'USEC_TO_TIMESTAMP',\n 'UTC_USEC_TO_DAY',\n 'UTC_USEC_TO_HOUR',\n 'UTC_USEC_TO_MONTH',\n 'UTC_USEC_TO_WEEK',\n 'UTC_USEC_TO_YEAR',\n 'WEEK',\n 'YEAR',\n\n // legacyIp\n 'FORMAT_IP',\n 'PARSE_IP',\n 'FORMAT_PACKED_IP',\n 'PARSE_PACKED_IP',\n\n // legacyJson\n 'JSON_EXTRACT',\n 'JSON_EXTRACT_SCALAR',\n\n // legacyMath\n 'ABS',\n 'ACOS',\n 'ACOSH',\n 'ASIN',\n 'ASINH',\n 'ATAN',\n 'ATANH',\n 'ATAN2',\n 'CEIL',\n 'COS',\n 'COSH',\n 'DEGREES',\n 'EXP',\n 'FLOOR',\n 'LN',\n 'LOG',\n 'LOG2',\n 'LOG10',\n 'PI',\n 'POW',\n 'RADIANS',\n 'RAND',\n 'ROUND',\n 'SIN',\n 'SINH',\n 'SQRT',\n 'TAN',\n 'TANH',\n\n // legacyRegex\n 'REGEXP_MATCH',\n 'REGEXP_EXTRACT',\n 'REGEXP_REPLACE',\n\n // legacyString\n 'CONCAT',\n // expr CONTAINS 'str'\n 'INSTR',\n 'LEFT',\n 'LENGTH',\n 'LOWER',\n 'LPAD',\n 'LTRIM',\n 'REPLACE',\n 'RIGHT',\n 'RPAD',\n 'RTRIM',\n 'SPLIT',\n 'SUBSTR',\n 'UPPER',\n\n // legacyTableWildcard\n 'TABLE_DATE_RANGE',\n 'TABLE_DATE_RANGE_STRICT',\n 'TABLE_QUERY',\n\n // legacyUrl\n 'HOST',\n 'DOMAIN',\n 'TLD',\n\n // legacyWindow\n 'AVG',\n 'COUNT',\n 'MAX',\n 'MIN',\n 'STDDEV',\n 'SUM',\n 'CUME_DIST',\n 'DENSE_RANK',\n 'FIRST_VALUE',\n 'LAG',\n 'LAST_VALUE',\n 'LEAD',\n 'NTH_VALUE',\n 'NTILE',\n 'PERCENT_RANK',\n 'PERCENTILE_CONT',\n 'PERCENTILE_DISC',\n 'RANK',\n 'RATIO_TO_REPORT',\n 'ROW_NUMBER',\n\n // legacyMisc\n 'CURRENT_USER',\n 'EVERY',\n 'FROM_BASE64',\n 'HASH',\n 'FARM_FINGERPRINT',\n 'IF',\n 'POSITION',\n 'SHA1',\n 'SOME',\n 'TO_BASE64',\n\n // other\n 'BQ.JOBS.CANCEL',\n 'BQ.REFRESH_MATERIALIZED_VIEW',\n\n // ddl\n 'OPTIONS',\n\n // pivot\n 'PIVOT',\n 'UNPIVOT',\n];\n","export const keywords: string[] = [\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#reserved_keywords\n 'ALL',\n 'AND',\n 'ANY',\n 'AS',\n 'ASC',\n 'ASSERT_ROWS_MODIFIED',\n 'AT',\n 'BETWEEN',\n 'BY',\n 'CASE',\n 'CAST',\n 'COLLATE',\n 'CONTAINS',\n 'CREATE',\n 'CROSS',\n 'CUBE',\n 'CURRENT',\n 'DEFAULT',\n 'DEFINE',\n 'DESC',\n 'DISTINCT',\n 'ELSE',\n 'END',\n 'ENUM',\n 'ESCAPE',\n 'EXCEPT',\n 'EXCLUDE',\n 'EXISTS',\n 'EXTRACT',\n 'FALSE',\n 'FETCH',\n 'FOLLOWING',\n 'FOR',\n 'FROM',\n 'FULL',\n 'GROUP',\n 'GROUPING',\n 'GROUPS',\n 'HASH',\n 'HAVING',\n 'IF',\n 'IGNORE',\n 'IN',\n 'INNER',\n 'INTERSECT',\n 'INTO',\n 'IS',\n 'JOIN',\n 'LATERAL',\n 'LEFT',\n 'LIMIT',\n 'LOOKUP',\n 'MERGE',\n 'NATURAL',\n 'NEW',\n 'NO',\n 'NOT',\n 'NULL',\n 'NULLS',\n 'OF',\n 'ON',\n 'OR',\n 'ORDER',\n 'OUTER',\n 'OVER',\n 'PARTITION',\n 'PRECEDING',\n 'PROTO',\n 'RANGE',\n 'RECURSIVE',\n 'RESPECT',\n 'RIGHT',\n 'ROLLUP',\n 'ROWS',\n 'SELECT',\n 'SET',\n 'SOME',\n 'TABLE',\n 'TABLESAMPLE',\n 'THEN',\n 'TO',\n 'TREAT',\n 'TRUE',\n 'UNBOUNDED',\n 'UNION',\n 'UNNEST',\n 'USING',\n 'WHEN',\n 'WHERE',\n 'WINDOW',\n 'WITH',\n 'WITHIN',\n\n // misc\n 'SAFE',\n\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language\n 'LIKE', // CREATE TABLE LIKE\n 'COPY', // CREATE TABLE COPY\n 'CLONE', // CREATE TABLE CLONE\n 'IN',\n 'OUT',\n 'INOUT',\n 'RETURNS',\n 'LANGUAGE',\n 'CASCADE',\n 'RESTRICT',\n 'DETERMINISTIC',\n];\n\nexport const dataTypes: string[] = [\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types\n 'ARRAY', // parametric, ARRAY<T>\n 'BOOL',\n 'BYTES', // parameterised, BYTES(Length)\n 'DATE',\n 'DATETIME',\n 'GEOGRAPHY',\n 'INTERVAL',\n 'INT64',\n 'INT',\n 'SMALLINT',\n 'INTEGER',\n 'BIGINT',\n 'TINYINT',\n 'BYTEINT',\n 'NUMERIC', // parameterised, NUMERIC(Precision[, Scale])\n 'DECIMAL', // parameterised, DECIMAL(Precision[, Scale])\n 'BIGNUMERIC', // parameterised, BIGNUMERIC(Precision[, Scale])\n 'BIGDECIMAL', // parameterised, BIGDECIMAL(Precision[, Scale])\n 'FLOAT64',\n 'STRING', // parameterised, STRING(Length)\n 'STRUCT', // parametric, STRUCT<T>\n 'TIME',\n 'TIMEZONE',\n];\n","import { DialectOptions } from '../../dialect.js';\nimport { expandPhrases } from '../../expandPhrases.js';\nimport { EOF_TOKEN, isToken, Token, TokenType } from '../../lexer/token.js';\nimport { functions } from './bigquery.functions.js';\nimport { dataTypes, keywords } from './bigquery.keywords.js';\n\nconst reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT] [AS STRUCT | AS VALUE]']);\n\nconst reservedClauses = expandPhrases([\n // Queries: https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax\n 'WITH [RECURSIVE]',\n 'FROM',\n 'WHERE',\n 'GROUP BY',\n 'HAVING',\n 'QUALIFY',\n 'WINDOW',\n 'PARTITION BY',\n 'ORDER BY',\n 'LIMIT',\n 'OFFSET',\n 'OMIT RECORD IF', // legacy\n // Data modification: https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax\n // - insert:\n 'INSERT [INTO]',\n 'VALUES',\n // - update:\n 'SET',\n // - merge:\n 'MERGE [INTO]',\n 'WHEN [NOT] MATCHED [BY SOURCE | BY TARGET] [THEN]',\n 'UPDATE SET',\n\n 'CLUSTER BY',\n 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE\n 'WITH CONNECTION',\n 'WITH PARTITION COLUMNS',\n 'REMOTE WITH CONNECTION',\n]);\n\nconst standardOnelineClauses = expandPhrases([\n 'CREATE [OR REPLACE] [TEMP|TEMPORARY|SNAPSHOT|EXTERNAL] TABLE [IF NOT EXISTS]',\n]);\n\nconst tabularOnelineClauses = expandPhrases([\n // - create:\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language\n 'CREATE [OR REPLACE] [MATERIALIZED] VIEW [IF NOT EXISTS]',\n // - update:\n 'UPDATE',\n // - delete:\n 'DELETE [FROM]',\n // - drop table:\n 'DROP [SNAPSHOT | EXTERNAL] TABLE [IF EXISTS]',\n // - alter table:\n 'ALTER TABLE [IF EXISTS]',\n 'ADD COLUMN [IF NOT EXISTS]',\n 'DROP COLUMN [IF EXISTS]',\n 'RENAME TO',\n 'ALTER COLUMN [IF EXISTS]',\n 'SET DEFAULT COLLATE', // for alter column\n 'SET OPTIONS', // for alter column\n 'DROP NOT NULL', // for alter column\n 'SET DATA TYPE', // for alter column\n // - alter schema\n 'ALTER SCHEMA [IF EXISTS]',\n // - alter view\n 'ALTER [MATERIALIZED] VIEW [IF EXISTS]',\n // - alter bi_capacity\n 'ALTER BI_CAPACITY',\n // - truncate:\n 'TRUNCATE TABLE',\n // - create schema\n 'CREATE SCHEMA [IF NOT EXISTS]',\n 'DEFAULT COLLATE',\n\n // stored procedures\n 'CREATE [OR REPLACE] [TEMP|TEMPORARY|TABLE] FUNCTION [IF NOT EXISTS]',\n 'CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]',\n // row access policy\n 'CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS]',\n 'GRANT TO',\n 'FILTER USING',\n // capacity\n 'CREATE CAPACITY',\n 'AS JSON',\n // reservation\n 'CREATE RESERVATION',\n // assignment\n 'CREATE ASSIGNMENT',\n // search index\n 'CREATE SEARCH INDEX [IF NOT EXISTS]',\n // drop\n 'DROP SCHEMA [IF EXISTS]',\n 'DROP [MATERIALIZED] VIEW [IF EXISTS]',\n 'DROP [TABLE] FUNCTION [IF EXISTS]',\n 'DROP PROCEDURE [IF EXISTS]',\n 'DROP ROW ACCESS POLICY',\n 'DROP ALL ROW ACCESS POLICIES',\n 'DROP CAPACITY [IF EXISTS]',\n 'DROP RESERVATION [IF EXISTS]',\n 'DROP ASSIGNMENT [IF EXISTS]',\n 'DROP SEARCH INDEX [IF EXISTS]',\n 'DROP [IF EXISTS]',\n // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language\n 'GRANT',\n 'REVOKE',\n // Script, https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting\n 'DECLARE',\n 'EXECUTE IMMEDIATE',\n 'LOOP',\n 'END LOOP',\n 'REPEAT',\n 'END REPEAT',\n 'WHILE',\n 'END WHILE',\n 'BREAK',\n 'LEAVE',\n 'CONTINUE',\n 'ITERATE',\n 'FOR',\n 'END FOR',\n 'BEGIN',\n 'BEGIN TRANSACTION',\n 'COMMIT TRANSACTION',\n 'ROLLBACK TRANSACTION',\n 'RAISE',\n 'RETURN',\n 'CALL',\n // Debug, https://cloud.google.com/bigquery/docs/reference/standard-sql/debugging-statements\n 'ASSERT',\n // Other, https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements\n 'EXPORT DATA',\n]);\n\nconst reservedSetOperations = expandPhrases([\n 'UNION {ALL | DISTINCT}',\n 'EXCEPT DISTINCT',\n 'INTERSECT DISTINCT',\n]);\n\nconst reservedJoins = expandPhrases([\n 'JOIN',\n '{LEFT | RIGHT | FULL} [OUTER] JOIN',\n '{INNER | CROSS} JOIN',\n]);\n\nconst reservedPhrases = expandPhrases([\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#tablesample_operator\n 'TABLESAMPLE SYSTEM',\n // From DDL: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language\n 'ANY TYPE',\n 'ALL COLUMNS',\n 'NOT DETERMINISTIC',\n // inside window definitions\n '{ROWS | RANGE} BETWEEN',\n // comparison operator\n 'IS [NOT] DISTINCT FROM',\n]);\n\n// https://cloud.google.com/bigquery/docs/reference/#standard-sql-reference\nexport const bigquery: DialectOptions = {\n name: 'bigquery',\n tokenizerOptions: {\n reservedSelect,\n reservedClauses: [...reservedClauses, ...tabularOnelineClauses, ...standardOnelineClauses],\n reservedSetOperations,\n reservedJoins,\n reservedPhrases,\n reservedKeywords: keywords,\n reservedDataTypes: dataTypes,\n reservedFunctionNames: functions,\n extraParens: ['[]'],\n stringTypes: [\n // The triple-quoted strings are listed first, so they get matched first.\n // Otherwise the first two quotes of \"\"\" will get matched as an empty \"\" string.\n { quote: '\"\"\"..\"\"\"', prefixes: ['R', 'B', 'RB', 'BR'] },\n { quote: \"'''..'''\", prefixes: ['R', 'B', 'RB', 'BR'] },\n '\"\"-bs',\n \"''-bs\",\n { quote: '\"\"-raw', prefixes: ['R', 'B', 'RB', 'BR'], requirePrefix: true },\n { quote: \"''-raw\", prefixes: ['R', 'B', 'RB', 'BR'], requirePrefix: true },\n ],\n identTypes: ['``'],\n identChars: { dashes: true },\n paramTypes: { positional: true, named: ['@'], quoted: ['@'] },\n variableTypes: [{ regex: String.raw`@@\\w+` }],\n lineCommentTypes: ['--', '#'],\n operators: ['&', '|', '^', '~', '>>', '<<', '||', '=>'],\n postProcess,\n },\n formatOptions: {\n onelineClauses: [...standardOnelineClauses, ...tabularOnelineClauses],\n tabularOnelineClauses,\n },\n};\n\nfunction postProcess(tokens: Token[]): Token[] {\n return detectArraySubscripts(combineParameterizedTypes(tokens));\n}\n\n// Converts OFFSET token inside array from RESERVED_CLAUSE to RESERVED_FUNCTION_NAME\n// See: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#array_subscript_operator\nfunction detectArraySubscripts(tokens: Token[]) {\n let prevToken = EOF_TOKEN;\n return tokens.map(token => {\n if (token.text === 'OFFSET' && prevToken.text === '[') {\n prevToken = token;\n return { ...token, type: TokenType.RESERVED_FUNCTION_NAME };\n } else {\n prevToken = token;\n return token;\n }\n });\n}\n\n// Combines multiple tokens forming a parameterized type like STRUCT<ARRAY<INT64>> into a single token\nfunction combineParameterizedTypes(tokens: Token[]) {\n const processed: Token[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if ((isToken.ARRAY(token) || isToken.STRUCT(token)) && tokens[i + 1]?.text === '<') {\n const endIndex = findClosingAngleBracketIndex(tokens, i + 1);\n const typeDefTokens = tokens.slice(i, endIndex + 1);\n processed.push({\n type: TokenType.IDENTIFIER,\n raw: typeDefTokens.map(formatTypeDefToken('raw')).join(''),\n text: typeDefTokens.map(formatTypeDefToken('text')).join(''),\n start: token.start,\n });\n i = endIndex;\n } else {\n processed.push(token);\n }\n }\n return processed;\n}\n\nconst formatTypeDefToken =\n (key: Extract<keyof Token, 'raw' | 'text'>) =>\n (token: Token): string => {\n if (token.type === TokenType.IDENTIFIER || token.type === TokenType.COMMA) {\n return token[key] + ' ';\n } else {\n return token[key];\n }\n };\n\nfunction findClosingAngleBracketIndex(tokens: Token[], startIndex: number): number {\n let level = 0;\n for (let i = startIndex; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.text === '<') {\n level++;\n } else if (token.text === '>') {\n level--;\n } else if (token.text === '>>') {\n level -= 2;\n }\n if (level === 0) {\n return i;\n }\n }\n return tokens.length - 1;\n}\n","export const functions: string[] = [\n // https://www.ibm.com/docs/en/db2/11.5?topic=bif-aggregate-functions\n 'ARRAY_AGG',\n 'AVG',\n 'CORRELATION',\n 'COUNT',\n 'COUNT_BIG',\n 'COVARIANCE',\n 'COVARIANCE_SAMP',\n 'CUME_DIST',\n 'GROUPING',\n 'LISTAGG',\n 'MAX',\n 'MEDIAN',\n 'MIN',\n 'PERCENTILE_CONT',\n 'PERCENTILE_DISC',\n 'PERCENT_RANK',\n 'REGR_AVGX',\n 'REGR_AVGY',\n 'REGR_COUNT',\n 'REGR_INTERCEPT',\n 'REGR_ICPT',\n 'REGR_R2',\n 'REGR_SLOPE',\n 'REGR_SXX',\n 'REGR_SXY',\n 'REGR_SYY',\n 'STDDEV',\n 'STDDEV_SAMP',\n 'SUM',\n 'VARIANCE',\n 'VARIANCE_SAMP',\n 'XMLAGG',\n 'XMLGROUP',\n\n // https://www.ibm.com/docs/en/db2/11.5?topic=bif-scalar-functions\n 'ABS',\n 'ABSVAL',\n 'ACOS',\n 'ADD_DAYS',\n 'ADD_HOURS',\n 'ADD_MINUTES',\n 'ADD_MONTHS',\n 'ADD_SECONDS',\n 'ADD_YEARS',\n 'AGE',\n 'ARRAY_DELETE',\n 'ARRAY_FIRST',\n 'ARRAY_LAST',\n 'ARRAY_NEXT',\n 'ARRAY_PRIOR',\n 'ASCII',\n 'ASCII_STR',\n 'ASIN',\n 'ATAN',\n 'ATAN2',\n 'ATANH',\n 'BITAND',\n 'BITANDNOT',\n 'BITOR',\n 'BITXOR',\n 'BITNOT',\n 'BPCHAR',\n 'BSON_TO_JSON',\n 'BTRIM',\n 'CARDINALITY',\n 'CEILING',\n 'CEIL',\n 'CHARACTER_LENGTH',\n 'CHR',\n 'COALESCE',\n 'COLLATION_KEY',\n 'COLLATION_KEY_BIT',\n 'COMPARE_DECFLOAT',\n 'CONCAT',\n 'COS',\n 'COSH',\n 'COT',\n 'CURSOR_ROWCOUNT',\n 'DATAPARTITIONNUM',\n 'DATE_PART',\n 'DATE_TRUNC',\n 'DAY',\n 'DAYNAME',\n 'DAYOFMONTH',\n 'DAYOFWEEK',\n 'DAYOFWEEK_ISO',\n 'DAYOFYEAR',\n 'DAYS',\n 'DAYS_BETWEEN',\n 'DAYS_TO_END_OF_MONTH',\n 'DBPARTITIONNUM',\n 'DECFLOAT',\n 'DECFLOAT_FORMAT',\n 'DECODE',\n 'DECRYPT_BIN',\n 'DECRYPT_CHAR',\n 'DEGREES',\n 'DEREF',\n 'DIFFERENCE',\n 'DIGITS',\n 'DOUBLE_PRECISION',\n 'EMPTY_BLOB',\n 'EMPTY_CLOB',\n 'EMPTY_DBCLOB',\n 'EMPTY_NCLOB',\n 'ENCRYPT',\n 'EVENT_MON_STATE',\n 'EXP',\n 'EXTRACT',\n 'FIRST_DAY',\n 'FLOOR',\n 'FROM_UTC_TIMESTAMP',\n 'GENERATE_UNIQUE',\n 'GETHINT',\n 'GREATEST',\n 'HASH',\n 'HASH4',\n 'HASH8',\n 'HASHEDVALUE',\n 'HEX',\n 'HEXTORAW',\n 'HOUR',\n 'HOURS_BETWEEN',\n 'IDENTITY_VAL_LOCAL',\n 'IFNULL',\n 'INITCAP',\n 'INSERT',\n 'INSTR',\n 'INSTR2',\n 'INSTR4',\n 'INSTRB',\n 'INTNAND',\n 'INTNOR',\n 'INTNXOR',\n 'INTNNOT',\n 'ISNULL',\n 'JSON_ARRAY',\n 'JSON_OBJECT',\n 'JSON_QUERY',\n 'JSON_TO_BSON',\n 'JSON_VALUE',\n 'JULIAN_DAY',\n 'LAST_DAY',\n 'LCASE',\n 'LEAST',\n 'LEFT',\n 'LENGTH',\n 'LENGTH2',\n 'LENGTH4',\n 'LENGTHB',\n 'LN',\n 'LOCATE',\n 'LOCATE_IN_STRING',\n 'LOG10',\n 'LONG_VARCHAR',\n 'LONG_VARGRAPHIC',\n 'LOWER',\n 'LPAD',\n 'LTRIM',\n 'MAX',\n 'MAX_CARDINALITY',\n 'MICROSECOND',\n 'MIDNIGHT_SECONDS',\n 'MIN',\n 'MINUTE',\n 'MINUTES_BETWEEN',\n 'MOD',\n 'MONTH',\n 'MONTHNAME',\n 'MONTHS_BETWEEN',\n 'MULTIPLY_ALT',\n 'NEXT_DAY',\n 'NEXT_MONTH',\n 'NEXT_QUARTER',\n 'NEXT_WEEK',\n 'NEXT_YEAR',\n 'NORMALIZE_DECFLOAT',\n 'NOW',\n 'NULLIF',\n 'NVL',\n 'NVL2',\n 'OCTET_LENGTH',\n 'OVERLAY',\n 'PARAMETER',\n 'POSITION',\n 'POSSTR',\n 'POW',\n 'POWER',\n 'QUANTIZE',\n 'QUARTER',\n 'QUOTE_IDENT',\n 'QUOTE_LITERAL',\n 'RADIANS',\n 'RAISE_ERROR',\n 'RAND',\n 'RANDOM',\n 'RAWTOHEX',\n 'REC2XML',\n 'REGEXP_COUNT',\n 'REGEXP_EXTRACT',\n 'REGEXP_INSTR',\n 'REGEXP_LIKE',\n 'REGEXP_MATCH_COUNT',\n 'REGEXP_REPLACE',\n 'REGEXP_SUBSTR',\n 'REPEAT',\n 'REPLACE',\n 'RID',\n 'RID_BIT',\n 'RIGHT',\n 'ROUND',\n 'ROUND_TIMESTAMP',\n 'RPAD',\n 'RTRIM',\n 'SECLABEL',\n 'SECLABEL_BY_NAME',\n 'SECLABEL_TO_CHAR',\n 'SECOND',\n 'SECONDS_BETWEEN',\n 'SIGN',\n 'SIN',\n 'SINH',\n 'SOUNDEX',\n 'SPACE',\n 'SQRT',\n 'STRIP',\n 'STRLEFT',\n 'STRPOS',\n 'STRRIGHT',\n 'SUBSTR',\n 'SUBSTR2',\n 'SUBSTR4',\n 'SUBSTRB',\n 'SUBSTRING',\n 'TABLE_NAME',\n 'TABLE_SCHEMA',\n 'TAN',\n 'TANH',\n 'THIS_MONTH',\n 'THIS_QUARTER',\n 'THIS_WEEK',\n 'THIS_YEAR',\n 'TIMESTAMP_FORMAT',\n 'TIMESTAMP_ISO',\n 'TIMESTAMPDIFF',\n 'TIMEZONE',\n 'TO_CHAR',\n 'TO_CLOB',\n 'TO_DATE',\n 'TO_HEX',\n 'TO_MULTI_BYTE',\n 'TO_NCHAR',\n 'TO_NCLOB',\n 'TO_NUMBER',\n 'TO_SINGLE_BYTE',\n 'TO_TIMESTAMP',\n 'TO_UTC_TIMESTAMP',\n 'TOTALORDER',\n 'TRANSLATE',\n 'TRIM',\n 'TRIM_ARRAY',\n 'TRUNC_TIMESTAMP',\n 'TRUNCATE',\n 'TRUNC',\n 'TYPE_ID',\n 'TYPE_NAME',\n 'TYPE_SCHEMA',\n 'UCASE',\n 'UNICODE_STR',\n 'UPPER',\n 'VALUE',\n 'VARCHAR_BIT_FORMAT',\n 'VARCHAR_FORMAT',\n 'VARCHAR_FORMAT_BIT',\n 'VERIFY_GROUP_FOR_USER',\n 'VERIFY_ROLE_FOR_USER',\n 'VERIFY_TRUSTED_CONTEXT_ROLE_FOR_USER',\n 'WEEK',\n 'WEEK_ISO',\n 'WEEKS_BETWEEN',\n 'WIDTH_BUCKET',\n 'XMLATTRIBUTES',\n 'XMLCOMMENT',\n 'XMLCONCAT',\n 'XMLDOCUMENT',\n 'XMLELEMENT',\n 'XMLFOREST',\n 'XMLNAMESPACES',\n 'XMLPARSE',\n 'XMLPI',\n 'XMLQUERY',\n 'XMLROW',\n 'XMLSERIALIZE',\n 'XMLTEXT',\n 'XMLVALIDATE',\n 'XMLXSROBJECTID',\n 'XSLTRANSFORM',\n 'YEAR',\n 'YEARS_BETWEEN',\n 'YMD_BETWEEN',\n\n // https://www.ibm.com/docs/en/db2/11.5?topic=bif-table-functions\n 'BASE_TABLE',\n 'JSON_TABLE',\n 'UNNEST',\n 'XMLTABLE',\n\n // https://www.ibm.com/docs/en/db2/11.5?topic=expressions-olap-specification\n // Additional function names not already present in the aggregate functions list\n 'RANK',\n 'DENSE_RANK',\n 'NTILE',\n 'LAG',\n 'LEAD',\n 'ROW_NUMBER',\n 'FIRST_VALUE',\n 'LAST_VALUE',\n 'NTH_VALUE',\n 'RATIO_TO_REPORT',\n\n // Type casting\n 'CAST',\n];\n","export const keywords: string[] = [\n // https://www.ibm.com/docs/en/db2/11.5?topic=sql-reserved-schema-names-reserved-words\n 'ACTIVATE',\n 'ADD',\n 'AFTER',\n 'ALIAS',\n 'ALL',\n 'ALLOCATE',\n 'ALLOW',\n 'ALTER',\n 'AND',\n 'ANY',\n 'AS',\n 'ASENSITIVE',\n 'ASSOCIATE',\n 'ASUTIME',\n 'AT',\n 'ATTRIBUTES',\n 'AUDIT',\n 'AUTHORIZATION',\n 'AUX',\n 'AUXILIARY',\n 'BEFORE',\n 'BEGIN',\n 'BETWEEN',\n 'BINARY',\n 'BUFFERPOOL',\n 'BY',\n 'CACHE',\n 'CALL',\n 'CALLED',\n 'CAPTURE',\n 'CARDINALITY',\n 'CASCADED',\n 'CASE',\n 'CAST',\n 'CHECK',\n 'CLONE',\n 'CLOSE',\n 'CLUSTER',\n 'COLLECTION',\n 'COLLID',\n 'COLUMN',\n 'COMMENT',\n 'COMMIT',\n 'CONCAT',\n 'CONDITION',\n 'CONNECT',\n 'CONNECTION',\n 'CONSTRAINT',\n 'CONTAINS',\n 'CONTINUE',\n 'COUNT',\n 'COUNT_BIG',\n 'CREATE',\n 'CROSS',\n 'CURRENT',\n 'CURRENT_DATE',\n 'CURRENT_LC_CTYPE',\n 'CURRENT_PATH',\n 'CURRENT_SCHEMA',\n 'CURRENT_SERVER',\n 'CURRENT_TIME',\n 'CURRENT_TIMESTAMP',\n 'CURRENT_TIMEZONE',\n 'CURRENT_USER',\n 'CURSOR',\n 'CYCLE',\n 'DATA',\n 'DATABASE',\n 'DATAPARTITIONNAME',\n 'DATAPARTITIONNUM',\n 'DAY',\n 'DAYS',\n 'DB2GENERAL',\n 'DB2GENRL',\n 'DB2SQL',\n 'DBINFO',\n 'DBPARTITIONNAME',\n 'DBPARTITIONNUM',\n 'DEALLOCATE',\n 'DECLARE',\n 'DEFAULT',\n 'DEFAULTS',\n 'DEFINITION',\n 'DELETE',\n 'DENSERANK',\n 'DENSE_RANK',\n 'DESCRIBE',\n 'DESCRIPTOR',\n 'DETERMINISTIC',\n 'DIAGNOSTICS',\n 'DISABLE',\n 'DISALLOW',\n 'DISCONNECT',\n 'DISTINCT',\n 'DO',\n 'DOCUMENT',\n 'DROP',\n 'DSSIZE',\n 'DYNAMIC',\n 'EACH',\n 'EDITPROC',\n 'ELSE',\n 'ELSEIF',\n 'ENABLE',\n 'ENCODING',\n 'ENCRYPTION',\n 'END',\n 'END-EXEC',\n 'ENDING',\n 'ERASE',\n 'ESCAPE',\n 'EVERY',\n 'EXCEPT',\n 'EXCEPTION',\n 'EXCLUDING',\n 'EXCLUSIVE',\n 'EXECUTE',\n 'EXISTS',\n 'EXIT',\n 'EXPLAIN',\n 'EXTENDED',\n 'EXTERNAL',\n 'EXTRACT',\n 'FENCED',\n 'FETCH',\n 'FIELDPROC',\n 'FILE',\n 'FINAL',\n 'FIRST1',\n 'FOR',\n 'FOREIGN',\n 'FREE',\n 'FROM',\n 'FULL',\n 'FUNCTION',\n 'GENERAL',\n 'GENERATED',\n 'GET',\n 'GLOBAL',\n 'GO',\n 'GOTO',\n 'GRANT',\n 'GRAPHIC',\n 'GROUP',\n 'HANDLER',\n 'HASH',\n 'HASHED_VALUE',\n 'HAVING',\n 'HINT',\n 'HOLD',\n 'HOUR',\n 'HOURS',\n 'IDENTITY',\n 'IF',\n 'IMMEDIATE',\n 'IMPORT',\n 'IN',\n 'INCLUDING',\n 'INCLUSIVE',\n 'INCREMENT',\n 'INDEX',\n 'INDICATOR',\n 'INDICATORS',\n 'INF',\n 'INFINITY',\n 'INHERIT',\n 'INNER',\n 'INOUT',\n 'INSENSITIVE',\n 'INSERT',\n 'INTEGRITY',\n 'INTERSECT',\n 'INTO',\n 'IS',\n 'ISNULL',\n 'ISOBID',\n 'ISOLATION',\n 'ITERATE',\n 'JAR',\n 'JAVA',\n 'JOIN',\n 'KEEP',\n 'KEY',\n 'LABEL',\n 'LANGUAGE',\n 'LAST3',\n 'LATERAL',\n 'LC_CTYPE',\n 'LEAVE',\n 'LEFT',\n 'LIKE',\n 'LIMIT',\n 'LINKTYPE',\n 'LOCAL',\n 'LOCALDATE',\n 'LOCALE',\n 'LOCALTIME',\n 'LOCALTIMESTAMP',\n 'LOCATOR',\n 'LOCATORS',\n 'LOCK',\n 'LOCKMAX',\n 'LOCKSIZE',\n 'LOOP',\n 'MAINTAINED',\n 'MATERIALIZED',\n 'MAXVALUE',\n 'MICROSECOND',\n 'MICROSECONDS',\n 'MINUTE',\n 'MINUTES',\n 'MINVALUE',\n 'MODE',\n 'MODIFIES',\n 'MONTH',\n 'MONTHS',\n 'NAN',\n 'NEW',\n 'NEW_TABLE',\n 'NEXTVAL',\n 'NO',\n 'NOCACHE',\n 'NOCYCLE',\n 'NODENAME',\n 'NODENUMBER',\n 'NOMAXVALUE',\n 'NOMINVALUE',\n 'NONE',\n 'NOORDER',\n 'NORMALIZED',\n 'NOT2',\n 'NOTNULL',\n 'NULL',\n 'NULLS',\n 'NUMPARTS',\n 'OBID',\n 'OF',\n 'OFF',\n 'OFFSET',\n 'OLD',\n 'OLD_TABLE',\n 'ON',\n 'OPEN',\n 'OPTIMIZATION',\n 'OPTIMIZE',\n 'OPTION',\n 'OR',\n 'ORDER',\n 'OUT',\n 'OUTER',\n 'OVER',\n 'OVERRIDING',\n 'PACKAGE',\n 'PADDED',\n 'PAGESIZE',\n 'PARAMETER',\n 'PART',\n 'PARTITION',\n 'PARTITIONED',\n 'PARTITIONING',\n 'PARTITIONS',\n 'PASSWORD',\n 'PATH',\n 'PERCENT',\n 'PIECESIZE',\n 'PLAN',\n 'POSITION',\n 'PRECISION',\n 'PREPARE',\n 'PREVVAL',\n 'PRIMARY',\n 'PRIQTY',\n 'PRIVILEGES',\n 'PROCEDURE',\n 'PROGRAM',\n 'PSID',\n 'PUBLIC',\n 'QUERY',\n 'QUERYNO',\n 'RANGE',\n 'RANK',\n 'READ',\n 'READS',\n 'RECOVERY',\n 'REFERENCES',\n 'REFERENCING',\n 'REFRESH',\n 'RELEASE',\n 'RENAME',\n 'REPEAT',\n 'RESET',\n 'RESIGNAL',\n 'RESTART',\n 'RESTRICT',\n 'RESULT',\n 'RESULT_SET_LOCATOR',\n 'RETURN',\n 'RETURNS',\n 'REVOKE',\n 'RIGHT',\n 'ROLE',\n 'ROLLBACK',\n 'ROUND_CEILING',\n 'ROUND_DOWN',\n 'ROUND_FLOOR',\n 'ROUND_HALF_DOWN',\n 'ROUND_HALF_EVEN',\n 'ROUND_HALF_UP',\n 'ROUND_UP',\n 'ROUTINE',\n 'ROW',\n 'ROWNUMBER',\n 'ROWS',\n 'ROWSET',\n 'ROW_NUMBER',\n 'RRN',\n 'RUN',\n 'SAVEPOINT',\n 'SCHEMA',\n 'SCRATCHPAD',\n 'SCROLL',\n 'SEARCH',\n 'SECOND',\n 'SECONDS',\n 'SECQTY',\n 'SECURITY',\n 'SELECT',\n 'SENSITIVE',\n 'SEQUENCE',\n 'SESSION',\n 'SESSION_USER',\n 'SET',\n 'SIGNAL',\n 'SIMPLE',\n 'SNAN',\n 'SOME',\n 'SOURCE',\n 'SPECIFIC',\n 'SQL',\n 'SQLID',\n 'STACKED',\n 'STANDARD',\n 'START',\n 'STARTING',\n 'STATEMENT',\n 'STATIC',\n 'STATMENT',\n 'STAY',\n 'STOGROUP',\n 'STORES',\n 'STYLE',\n 'SUBSTRING',\n 'SUMMARY',\n 'SYNONYM',\n 'SYSFUN',\n 'SYSIBM',\n 'SYSPROC',\n 'SYSTEM',\n 'SYSTEM_USER',\n 'TABLE',\n 'TABLESPACE',\n 'THEN',\n 'TO',\n 'TRANSACTION',\n 'TRIGGER',\n 'TRIM',\n 'TRUNCATE',\n 'TYPE',\n 'UNDO',\n 'UNION',\n 'UNIQUE',\n 'UNTIL',\n 'UPDATE',\n 'USAGE',\n 'USER',\n 'USING',\n 'VALIDPROC',\n 'VALUE',\n 'VALUES',\n 'VARIABLE',\n 'VARIANT',\n 'VCAT',\n 'VERSION',\n 'VIEW',\n 'VOLATILE',\n 'VOLUMES',\n 'WHEN',\n 'WHENEVER',\n 'WHERE',\n 'WHILE',\n 'WITH',\n 'WITHOUT',\n 'WLM',\n 'WRITE',\n 'XMLELEMENT',\n 'XMLEXISTS',\n 'XMLNAMESPACES',\n 'YEAR',\n 'YEARS',\n];\n\nexport const dataTypes: string[] = [\n // https://www.ibm.com/docs/en/db2-for-zos/12?topic=columns-data-types\n 'ARRAY',\n 'BIGINT',\n 'BINARY',\n 'BLOB',\n 'BOOLEAN',\n 'CCSID',\n 'CHAR',\n 'CHARACTER',\n 'CLOB',\n 'DATE',\n 'DATETIME',\n 'DBCLOB',\n 'DEC',\n 'DECIMAL',\n 'DOUBLE',\n 'DOUBLE PRECISION',\n 'FLOAT',\n 'FLOAT4',\n 'FLOAT8',\n 'GRAPHIC',\n 'INT',\n 'INT2',\n 'INT4',\n 'INT8',\n 'INTEGER',\n 'INTERVAL',\n 'LONG VARCHAR',\n 'LONG VARGRAPHIC',\n 'NCHAR',\n 'NCHR',\n 'NCLOB',\n 'NVARCHAR',\n 'NUMERIC',\n 'SMALLINT',\n 'REAL',\n 'TIME',\n 'TIMESTAMP',\n 'VARBINARY',\n 'VARCHAR',\n 'VARGRAPHIC',\n];\n","import { DialectOptions } from '../../dialect.js';\nimport { expandPhrases } from '../../expandPhrases.js';\nimport { functions } from './db2.functions.js';\nimport { dataTypes, keywords } from './db2.keywords.js';\n\nconst reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT]']);\n\nconst reservedClauses = expandPhrases([\n // queries\n 'WITH',\n 'FROM',\n 'WHERE',\n 'GROUP BY',\n 'HAVING',\n 'PARTITION BY',\n 'ORDER BY [INPUT SEQUENCE]',\n 'LIMIT',\n 'OFFSET',\n 'FETCH NEXT',\n 'FOR UPDATE [OF]',\n 'FOR {READ | FETCH} ONLY',\n 'FOR {RR | CS | UR | RS} [USE AND KEEP {SHARE | UPDATE | EXCLUSIVE} LOCKS]',\n 'WAIT FOR OUTCOME',\n 'SKIP LOCKED DATA',\n 'INTO',\n // Data modification\n // - insert:\n 'INSERT INTO',\n 'VALUES',\n // - update:\n 'SET',\n // - merge:\n 'MERGE INTO',\n 'WHEN [NOT] MATCHED [THEN]',\n 'UPDATE SET',\n 'INSERT',\n]);\n\nconst standardOnelineClauses = expandPhrases([\n 'CREATE [GLOBAL TEMPORARY | EXTERNAL] TABLE [IF NOT EXISTS]',\n]);\n\nconst tabularOnelineClauses = expandPhrases([\n // - create:\n 'CREATE [OR REPLACE] VIEW',\n // - update:\n 'UPDATE',\n 'WHERE CURRENT OF',\n 'WITH {RR | RS | CS | UR}',\n // - delete:\n 'DELETE FROM',\n // - drop table:\n 'DROP TABLE [IF EXISTS]',\n // alter table:\n 'ALTER TABLE',\n 'ADD [COLUMN]',\n 'DROP [COLUMN]',\n 'RENAME COLUMN',\n 'ALTER [COLUMN]',\n 'SET DATA TYPE', // for alter column\n 'SET NOT NULL', // for alter column\n 'DROP {DEFAULT | GENERATED | NOT NULL}', // for alte