@hdnax/sqlingo.js 0.0.4 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +8 -14
- package/README.npm.md +8 -14
- package/README.repo.md +1 -2
- package/dist/chunk-2YNOERAO.cjs +2 -0
- package/dist/chunk-2YNOERAO.cjs.map +1 -0
- package/dist/chunk-2Z3O2CFM.cjs +19 -0
- package/dist/chunk-2Z3O2CFM.cjs.map +1 -0
- package/dist/chunk-4ZMKB6PV.cjs +2 -0
- package/dist/chunk-4ZMKB6PV.cjs.map +1 -0
- package/dist/chunk-53OWF4GG.js +2 -0
- package/dist/chunk-53OWF4GG.js.map +1 -0
- package/dist/chunk-C4CLTVOW.cjs +2 -0
- package/dist/chunk-C4CLTVOW.cjs.map +1 -0
- package/dist/chunk-DOKMTZYO.cjs +4 -0
- package/dist/chunk-DOKMTZYO.cjs.map +1 -0
- package/dist/chunk-FCGUTI7Y.js +2 -0
- package/dist/chunk-FCGUTI7Y.js.map +1 -0
- package/dist/chunk-IPCIXWCY.js +2 -0
- package/dist/chunk-IPCIXWCY.js.map +1 -0
- package/dist/chunk-KCNOE4DZ.js +19 -0
- package/dist/chunk-KCNOE4DZ.js.map +1 -0
- package/dist/chunk-NRJHX2GZ.js +2 -0
- package/dist/chunk-NRJHX2GZ.js.map +1 -0
- package/dist/chunk-O2J5RKBN.js +2 -0
- package/dist/chunk-O2J5RKBN.js.map +1 -0
- package/dist/chunk-PXUASP5I.js +2 -0
- package/dist/chunk-PXUASP5I.js.map +1 -0
- package/dist/chunk-R7C3ZHVK.cjs +2 -0
- package/dist/chunk-R7C3ZHVK.cjs.map +1 -0
- package/dist/chunk-UHWHUDLE.cjs +2 -0
- package/dist/chunk-UHWHUDLE.cjs.map +1 -0
- package/dist/chunk-WRNYJ54A.cjs +2 -0
- package/dist/chunk-WRNYJ54A.cjs.map +1 -0
- package/dist/chunk-XZQFOICX.cjs +3 -0
- package/dist/chunk-XZQFOICX.cjs.map +1 -0
- package/dist/chunk-YLOQRUXC.js +2 -0
- package/dist/chunk-YLOQRUXC.js.map +1 -0
- package/dist/chunk-YSS2WVCM.cjs +2 -0
- package/dist/chunk-YSS2WVCM.cjs.map +1 -0
- package/dist/chunk-Z5V6VOIN.js +3 -0
- package/dist/chunk-Z5V6VOIN.js.map +1 -0
- package/dist/chunk-ZBFGQPJR.js +4 -0
- package/dist/chunk-ZBFGQPJR.js.map +1 -0
- package/dist/dialects/athena.cjs +2 -0
- package/dist/dialects/athena.cjs.map +1 -0
- package/dist/dialects/athena.d.cts +66 -0
- package/dist/dialects/athena.d.ts +66 -0
- package/dist/dialects/athena.js +2 -0
- package/dist/dialects/athena.js.map +1 -0
- package/dist/dialects/bigquery.cjs +3 -0
- package/dist/dialects/bigquery.cjs.map +1 -0
- package/dist/dialects/bigquery.d.cts +651 -0
- package/dist/dialects/bigquery.d.ts +651 -0
- package/dist/dialects/bigquery.js +3 -0
- package/dist/dialects/bigquery.js.map +1 -0
- package/dist/dialects/clickhouse.cjs +2 -0
- package/dist/dialects/clickhouse.cjs.map +1 -0
- package/dist/dialects/clickhouse.d.cts +634 -0
- package/dist/dialects/clickhouse.d.ts +634 -0
- package/dist/dialects/clickhouse.js +2 -0
- package/dist/dialects/clickhouse.js.map +1 -0
- package/dist/dialects/databricks.cjs +2 -0
- package/dist/dialects/databricks.cjs.map +1 -0
- package/dist/dialects/databricks.d.cts +484 -0
- package/dist/dialects/databricks.d.ts +484 -0
- package/dist/dialects/databricks.js +2 -0
- package/dist/dialects/databricks.js.map +1 -0
- package/dist/dialects/doris.cjs +2 -0
- package/dist/dialects/doris.cjs.map +1 -0
- package/dist/dialects/doris.d.cts +484 -0
- package/dist/dialects/doris.d.ts +484 -0
- package/dist/dialects/doris.js +2 -0
- package/dist/dialects/doris.js.map +1 -0
- package/dist/dialects/dremio.cjs +2 -0
- package/dist/dialects/dremio.cjs.map +1 -0
- package/dist/dialects/dremio.d.cts +522 -0
- package/dist/dialects/dremio.d.ts +522 -0
- package/dist/dialects/dremio.js +2 -0
- package/dist/dialects/dremio.js.map +1 -0
- package/dist/dialects/drill.cjs +2 -0
- package/dist/dialects/drill.cjs.map +1 -0
- package/dist/dialects/drill.d.cts +512 -0
- package/dist/dialects/drill.d.ts +512 -0
- package/dist/dialects/drill.js +2 -0
- package/dist/dialects/drill.js.map +1 -0
- package/dist/dialects/druid.cjs +2 -0
- package/dist/dialects/druid.cjs.map +1 -0
- package/dist/dialects/druid.d.cts +17 -0
- package/dist/dialects/druid.d.ts +17 -0
- package/dist/dialects/druid.js +2 -0
- package/dist/dialects/druid.js.map +1 -0
- package/dist/dialects/duckdb.cjs +86 -0
- package/dist/dialects/duckdb.cjs.map +1 -0
- package/dist/dialects/duckdb.d.cts +756 -0
- package/dist/dialects/duckdb.d.ts +756 -0
- package/dist/dialects/duckdb.js +86 -0
- package/dist/dialects/duckdb.js.map +1 -0
- package/dist/dialects/dune.cjs +2 -0
- package/dist/dialects/dune.cjs.map +1 -0
- package/dist/dialects/dune.d.cts +21 -0
- package/dist/dialects/dune.d.ts +21 -0
- package/dist/dialects/dune.js +2 -0
- package/dist/dialects/dune.js.map +1 -0
- package/dist/dialects/exasol.cjs +2 -0
- package/dist/dialects/exasol.cjs.map +1 -0
- package/dist/dialects/exasol.d.cts +507 -0
- package/dist/dialects/exasol.d.ts +507 -0
- package/dist/dialects/exasol.js +2 -0
- package/dist/dialects/exasol.js.map +1 -0
- package/dist/dialects/fabric.cjs +2 -0
- package/dist/dialects/fabric.cjs.map +1 -0
- package/dist/dialects/fabric.d.cts +463 -0
- package/dist/dialects/fabric.d.ts +463 -0
- package/dist/dialects/fabric.js +2 -0
- package/dist/dialects/fabric.js.map +1 -0
- package/dist/dialects/hive.cjs +2 -0
- package/dist/dialects/hive.cjs.map +1 -0
- package/dist/dialects/hive.d.cts +585 -0
- package/dist/dialects/hive.d.ts +585 -0
- package/dist/dialects/hive.js +2 -0
- package/dist/dialects/hive.js.map +1 -0
- package/dist/dialects/materialize.cjs +2 -0
- package/dist/dialects/materialize.cjs.map +1 -0
- package/dist/dialects/materialize.d.cts +890 -0
- package/dist/dialects/materialize.d.ts +890 -0
- package/dist/dialects/materialize.js +2 -0
- package/dist/dialects/materialize.js.map +1 -0
- package/dist/dialects/mysql.cjs +2 -0
- package/dist/dialects/mysql.cjs.map +1 -0
- package/dist/dialects/mysql.d.cts +292 -0
- package/dist/dialects/mysql.d.ts +292 -0
- package/dist/dialects/mysql.js +2 -0
- package/dist/dialects/mysql.js.map +1 -0
- package/dist/dialects/oracle.cjs +2 -0
- package/dist/dialects/oracle.cjs.map +1 -0
- package/dist/dialects/oracle.d.cts +539 -0
- package/dist/dialects/oracle.d.ts +539 -0
- package/dist/dialects/oracle.js +2 -0
- package/dist/dialects/oracle.js.map +1 -0
- package/dist/dialects/postgres.cjs +2 -0
- package/dist/dialects/postgres.cjs.map +1 -0
- package/dist/dialects/postgres.d.cts +587 -0
- package/dist/dialects/postgres.d.ts +587 -0
- package/dist/dialects/postgres.js +2 -0
- package/dist/dialects/postgres.js.map +1 -0
- package/dist/dialects/presto.cjs +2 -0
- package/dist/dialects/presto.cjs.map +1 -0
- package/dist/dialects/presto.d.cts +173 -0
- package/dist/dialects/presto.d.ts +173 -0
- package/dist/dialects/presto.js +2 -0
- package/dist/dialects/presto.js.map +1 -0
- package/dist/dialects/prql.cjs +2 -0
- package/dist/dialects/prql.cjs.map +1 -0
- package/dist/dialects/prql.d.cts +496 -0
- package/dist/dialects/prql.d.ts +496 -0
- package/dist/dialects/prql.js +2 -0
- package/dist/dialects/prql.js.map +1 -0
- package/dist/dialects/redshift.cjs +2 -0
- package/dist/dialects/redshift.cjs.map +1 -0
- package/dist/dialects/redshift.d.cts +132 -0
- package/dist/dialects/redshift.d.ts +132 -0
- package/dist/dialects/redshift.js +2 -0
- package/dist/dialects/redshift.js.map +1 -0
- package/dist/dialects/risingwave.cjs +2 -0
- package/dist/dialects/risingwave.cjs.map +1 -0
- package/dist/dialects/risingwave.d.cts +478 -0
- package/dist/dialects/risingwave.d.ts +478 -0
- package/dist/dialects/risingwave.js +2 -0
- package/dist/dialects/risingwave.js.map +1 -0
- package/dist/dialects/singlestore.cjs +2 -0
- package/dist/dialects/singlestore.cjs.map +1 -0
- package/dist/dialects/singlestore.d.cts +73 -0
- package/dist/dialects/singlestore.d.ts +73 -0
- package/dist/dialects/singlestore.js +2 -0
- package/dist/dialects/singlestore.js.map +1 -0
- package/dist/dialects/snowflake.cjs +3 -0
- package/dist/dialects/snowflake.cjs.map +1 -0
- package/dist/dialects/snowflake.d.cts +320 -0
- package/dist/dialects/snowflake.d.ts +320 -0
- package/dist/dialects/snowflake.js +3 -0
- package/dist/dialects/snowflake.js.map +1 -0
- package/dist/dialects/solr.cjs +2 -0
- package/dist/dialects/solr.cjs.map +1 -0
- package/dist/dialects/solr.d.cts +458 -0
- package/dist/dialects/solr.d.ts +458 -0
- package/dist/dialects/solr.js +2 -0
- package/dist/dialects/solr.js.map +1 -0
- package/dist/dialects/spark.cjs +2 -0
- package/dist/dialects/spark.cjs.map +1 -0
- package/dist/dialects/spark.d.cts +484 -0
- package/dist/dialects/spark.d.ts +484 -0
- package/dist/dialects/spark.js +2 -0
- package/dist/dialects/spark.js.map +1 -0
- package/dist/dialects/spark2.cjs +2 -0
- package/dist/dialects/spark2.cjs.map +1 -0
- package/dist/dialects/spark2.d.cts +486 -0
- package/dist/dialects/spark2.d.ts +486 -0
- package/dist/dialects/spark2.js +2 -0
- package/dist/dialects/spark2.js.map +1 -0
- package/dist/dialects/sqlite.cjs +2 -0
- package/dist/dialects/sqlite.cjs.map +1 -0
- package/dist/dialects/sqlite.d.cts +510 -0
- package/dist/dialects/sqlite.d.ts +510 -0
- package/dist/dialects/sqlite.js +2 -0
- package/dist/dialects/sqlite.js.map +1 -0
- package/dist/dialects/starrocks.cjs +2 -0
- package/dist/dialects/starrocks.cjs.map +1 -0
- package/dist/dialects/starrocks.d.cts +518 -0
- package/dist/dialects/starrocks.d.ts +518 -0
- package/dist/dialects/starrocks.js +2 -0
- package/dist/dialects/starrocks.js.map +1 -0
- package/dist/dialects/tableau.cjs +2 -0
- package/dist/dialects/tableau.cjs.map +1 -0
- package/dist/dialects/tableau.d.cts +466 -0
- package/dist/dialects/tableau.d.ts +466 -0
- package/dist/dialects/tableau.js +2 -0
- package/dist/dialects/tableau.js.map +1 -0
- package/dist/dialects/teradata.cjs +2 -0
- package/dist/dialects/teradata.cjs.map +1 -0
- package/dist/dialects/teradata.d.cts +539 -0
- package/dist/dialects/teradata.d.ts +539 -0
- package/dist/dialects/teradata.js +2 -0
- package/dist/dialects/teradata.js.map +1 -0
- package/dist/dialects/trino.cjs +2 -0
- package/dist/dialects/trino.cjs.map +1 -0
- package/dist/dialects/trino.d.cts +465 -0
- package/dist/dialects/trino.d.ts +465 -0
- package/dist/dialects/trino.js +2 -0
- package/dist/dialects/trino.js.map +1 -0
- package/dist/dialects/tsql.cjs +2 -0
- package/dist/dialects/tsql.cjs.map +1 -0
- package/dist/dialects/tsql.d.cts +703 -0
- package/dist/dialects/tsql.d.ts +703 -0
- package/dist/dialects/tsql.js +2 -0
- package/dist/dialects/tsql.js.map +1 -0
- package/dist/index.cjs +5 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -14178
- package/dist/index.d.ts +3 -14178
- package/dist/index.js +5 -25
- package/dist/index.js.map +1 -1
- package/dist/tokens-VcMD09XM.d.cts +15805 -0
- package/dist/tokens-VcMD09XM.d.ts +15805 -0
- package/package.json +171 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/typing/snowflake.ts","../../src/dialects/snowflake.ts"],"sourcesContent":["import type {\n ExpressionOrString,\n} from '../expressions/expressions';\nimport {\n cache,\n isInstanceOf, filterInstanceOf,\n} from '../port_internals';\nimport {\n DataTypeExprKind,\n} from '../expressions/types';\nimport {\n Expression,\n DataTypeExpr, ReverseExpr, TimestampFromPartsExpr, DecodeCaseExpr,\n ArgMaxExpr, ArgMinExpr, WithinGroupExpr, PercentileDiscExpr, PercentileContExpr,\n OrderExpr, OrderedExpr, MedianExpr, KurtosisExpr, StrToTimeExpr,\n AddMonthsExpr, CeilExpr, DateTruncExpr, FloorExpr, LeftExpr, ModeExpr, PadExpr,\n RightExpr, RoundExpr, StuffExpr, SubstringExpr, TimeSliceExpr, TimestampTruncExpr,\n ApproxTopKExpr, ApproxTopKEstimateExpr, ArrayExpr, ArrayAggExpr, ArrayAppendExpr,\n ArrayCompactExpr, ArrayConcatExpr, ArrayConstructCompactExpr, ArrayPrependExpr,\n ArrayRemoveExpr, ArraysZipExpr, ArrayUniqueAggExpr, ArrayUnionAggExpr, MapKeysExpr,\n RegexpExtractAllExpr, SplitExpr, StringToArrayExpr, BitmapBitPositionExpr,\n BitmapBucketNumberExpr, BitmapCountExpr, FactorialExpr, GroupingIdExpr,\n Md5NumberLower64Expr, Md5NumberUpper64Expr, RandExpr, Seq8Expr, ZipfExpr,\n Base64DecodeBinaryExpr, BitmapConstructAggExpr, BitmapOrAggExpr, CompressExpr,\n DecompressBinaryExpr, DecryptExpr, DecryptRawExpr, EncryptExpr, EncryptRawExpr,\n HexStringExpr, Md5DigestExpr, Sha1DigestExpr, Sha2DigestExpr, ToBinaryExpr,\n TryBase64DecodeBinaryExpr, TryHexDecodeBinaryExpr, UnhexExpr, BoolandExpr,\n BoolnotExpr, BoolorExpr, BoolxorAggExpr, EqualNullExpr, IsNullValueExpr,\n MapContainsKeyExpr, SearchExpr, SearchIpExpr, ToBooleanExpr, NextDayExpr,\n PreviousDayExpr, BitwiseAndAggExpr, BitwiseOrAggExpr, BitwiseXorAggExpr,\n RegexpCountExpr, RegexpInstrExpr, ToNumberExpr, ApproxPercentileEstimateExpr,\n ApproximateSimilarityExpr, CosineDistanceExpr, CovarPopExpr, CovarSampExpr,\n DotProductExpr, EuclideanDistanceExpr, ManhattanDistanceExpr, MonthsBetweenExpr,\n NormalExpr, ToDecfloatExpr, TryToDecfloatExpr, AcosExpr, AsinExpr, AtanExpr,\n Atan2Expr, CbrtExpr, CosExpr, CotExpr, DegreesExpr, ExpExpr, LnExpr, LogExpr,\n PowExpr, RadiansExpr, RegrAvgxExpr, RegrAvgyExpr, RegrCountExpr, RegrInterceptExpr,\n RegrR2Expr, RegrSlopeExpr, RegrSxxExpr, RegrSxyExpr, RegrSyyExpr, RegrValxExpr,\n RegrValyExpr, SinExpr, SqrtExpr, TanExpr, TanhExpr, ByteLengthExpr, GroupingExpr,\n JarowinklerSimilarityExpr, MapSizeExpr, MinuteExpr, RtrimmedLengthExpr,\n SecondExpr, Seq1Expr, Seq2Expr, Seq4Expr, WidthBucketExpr, ApproxPercentileAccumulateExpr,\n ApproxPercentileCombineExpr, ApproxTopKAccumulateExpr, ApproxTopKCombineExpr,\n ObjectAggExpr, ParseIpExpr, ParseUrlExpr, XmlGetExpr, MapCatExpr, MapDeleteExpr,\n MapInsertExpr, MapPickExpr, ToFileExpr, TimeFromPartsExpr, TsOrDsToTimeExpr,\n CurrentTimestampExpr, LocaltimestampExpr, QuarterExpr, AiAggExpr, AiClassifyExpr,\n AiSummarizeAggExpr, Base64DecodeStringExpr, Base64EncodeExpr, CheckJsonExpr,\n CheckXmlExpr, CollateExpr, CollationExpr, CurrentAccountExpr, CurrentAccountNameExpr,\n CurrentAvailableRolesExpr, CurrentClientExpr, CurrentDatabaseExpr, CurrentIpAddressExpr,\n CurrentSchemasExpr, CurrentSecondaryRolesExpr, CurrentSessionExpr, CurrentStatementExpr,\n CurrentVersionExpr, CurrentTransactionExpr, CurrentWarehouseExpr,\n CurrentOrganizationUserExpr, CurrentRegionExpr, CurrentRoleExpr, CurrentRoleTypeExpr,\n CurrentOrganizationNameExpr, DecompressStringExpr, HexDecodeStringExpr, HexEncodeExpr,\n MonthnameExpr, RandstrExpr, RegexpExtractExpr, RegexpReplaceExpr, RepeatExpr,\n ReplaceExpr, SoundexExpr, SoundexP123Expr, SplitPartExpr, TryBase64DecodeStringExpr,\n TryHexDecodeStringExpr, UuidExpr, MinhashExpr, MinhashCombineExpr, VarianceExpr,\n VariancePopExpr, ConcatWsExpr, ConvertTimezoneExpr, DateAddExpr, HashAggExpr, TimeAddExpr,\n} from '../expressions/expressions';\nimport type {\n TypeAnnotator,\n} from '../optimizer';\nimport {\n DialectTyping,\n} from './dialect';\nimport type {\n ExpressionMetadata,\n} from './dialect';\n\nconst DATE_PARTS = new Set([\n 'DAY',\n 'WEEK',\n 'MONTH',\n 'QUARTER',\n 'YEAR',\n]);\nconst MAX_PRECISION = 38;\nconst MAX_SCALE = 37;\n\nfunction annotateReverse (this: TypeAnnotator, expression: ReverseExpr): ReverseExpr {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n if (expression.isType(DataTypeExprKind.NULL)) {\n // Snowflake treats REVERSE(NULL) as a VARCHAR\n this.setType(expression, DataTypeExprKind.VARCHAR);\n }\n return expression;\n}\n\nfunction annotateTimestampFromParts (this: TypeAnnotator, expression: TimestampFromPartsExpr): TimestampFromPartsExpr {\n if (expression.args.zone) {\n this.setType(expression, DataTypeExprKind.TIMESTAMPTZ);\n } else {\n this.setType(expression, DataTypeExprKind.TIMESTAMP);\n }\n return expression;\n}\n\nfunction annotateDateOrTimeAdd (this: TypeAnnotator, expression: Expression): Expression {\n const thisArg = expression.args.this;\n if (isInstanceOf(thisArg, Expression) && thisArg.isType(DataTypeExprKind.DATE) && !DATE_PARTS.has(expression.text('unit').toUpperCase())) {\n this.setType(expression, DataTypeExprKind.TIMESTAMPNTZ);\n } else {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n }\n return expression;\n}\n\nfunction annotateDecodeCase (this: TypeAnnotator, expression: DecodeCaseExpr): DecodeCaseExpr {\n const expressions = expression.args.expressions ?? [\n ];\n const returnTypes: (ExpressionOrString | undefined)[] = [\n ];\n\n for (let i = 2; i < expressions.length; i += 2) {\n returnTypes.push(expressions[i].type);\n }\n\n if (expressions.length % 2 === 0) {\n returnTypes.push(expressions[expressions.length - 1].type);\n }\n\n let lastType: DataTypeExpr | DataTypeExprKind | undefined;\n for (const retType of returnTypes) {\n const narrowedRetType = isInstanceOf(retType, DataTypeExpr) ? retType : undefined;\n lastType = this.maybeCoerce(lastType || narrowedRetType, narrowedRetType);\n }\n\n this.setType(expression, lastType);\n return expression;\n}\n\nfunction annotateArgMaxMin (this: TypeAnnotator, expression: ArgMaxExpr | ArgMinExpr): Expression {\n const thisArg = expression.args.this;\n const thisType = isInstanceOf(thisArg, Expression) ? thisArg.type : undefined;\n this.setType(\n expression,\n expression.args.count ? DataTypeExprKind.ARRAY : (isInstanceOf(thisType, DataTypeExpr) ? thisType : undefined),\n );\n return expression;\n}\n\nfunction annotateWithinGroup (this: TypeAnnotator, expression: WithinGroupExpr): WithinGroupExpr {\n const inner = expression.args.this;\n const orderExpr = expression.args.expression;\n const orderExprs = isInstanceOf(orderExpr, OrderExpr)\n ? (orderExpr.args.expressions ?? [\n ])\n : [\n ];\n\n if (\n (isInstanceOf(inner, PercentileDiscExpr) || isInstanceOf(inner, PercentileContExpr))\n && isInstanceOf(orderExpr, OrderExpr)\n && orderExprs.length === 1\n && isInstanceOf(orderExprs[0], OrderedExpr)\n ) {\n const firstThis = orderExprs[0].args.this;\n const firstType = isInstanceOf(firstThis, Expression) ? firstThis.type : undefined;\n this.setType(expression, isInstanceOf(firstType, DataTypeExpr) ? firstType : undefined);\n }\n\n return expression;\n}\n\nfunction annotateMedian (this: TypeAnnotator, expression: MedianExpr): MedianExpr {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n const thisArg = expression.args.this;\n const inputType = isInstanceOf(thisArg, Expression) ? thisArg.type : undefined;\n if (!isInstanceOf(inputType, DataTypeExpr)) return expression;\n\n if (inputType.isType(DataTypeExprKind.DOUBLE)) {\n this.setType(expression, DataTypeExprKind.DOUBLE);\n } else {\n const exprs = filterInstanceOf(inputType.args.expressions ?? [\n ], Expression);\n // Assuming text('this') retrieves the numeric value of the AST literal node\n const precision = exprs[0] ? Number(exprs[0].text('this')) : MAX_PRECISION;\n const scale = exprs[1] ? Number(exprs[1].text('this')) : 0;\n\n const newPrecision = Math.min(precision + 3, MAX_PRECISION);\n const newScale = Math.min(scale + 3, MAX_SCALE);\n\n const newType = DataTypeExpr.build(`NUMBER(${newPrecision}, ${newScale})`, {\n dialect: 'snowflake',\n });\n this.setType(expression, newType);\n }\n\n return expression;\n}\n\nfunction annotateVariance (this: TypeAnnotator, expression: Expression): Expression {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n const thisArg = expression.args.this;\n const inputType = isInstanceOf(thisArg, Expression) ? thisArg.type : undefined;\n if (!isInstanceOf(inputType, DataTypeExpr)) return expression;\n\n if (inputType.isType(DataTypeExprKind.DECFLOAT)) {\n this.setType(expression, DataTypeExpr.build('DECFLOAT', {\n dialect: 'snowflake',\n }));\n } else if (inputType.isType([\n DataTypeExprKind.FLOAT,\n DataTypeExprKind.DOUBLE,\n ])) {\n this.setType(expression, DataTypeExprKind.DOUBLE);\n } else {\n const exprs = filterInstanceOf(inputType.args.expressions ?? [\n ], Expression);\n const scale = exprs[1] ? Number(exprs[1].text('this')) : 0;\n const newScale = scale === 0 ? 6 : Math.max(12, scale);\n\n const newType = DataTypeExpr.build(`NUMBER(${MAX_PRECISION}, ${newScale})`, {\n dialect: 'snowflake',\n });\n this.setType(expression, newType);\n }\n\n return expression;\n}\n\nfunction annotateKurtosis (this: TypeAnnotator, expression: KurtosisExpr): KurtosisExpr {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n const thisArg = expression.args.this;\n const inputType = isInstanceOf(thisArg, Expression) ? thisArg.type : undefined;\n if (!isInstanceOf(inputType, DataTypeExpr)) {\n this.setType(expression, DataTypeExpr.build(`NUMBER(${MAX_PRECISION}, 12)`, {\n dialect: 'snowflake',\n }));\n return expression;\n }\n\n if (inputType.isType(DataTypeExprKind.DECFLOAT)) {\n this.setType(expression, DataTypeExpr.build('DECFLOAT', {\n dialect: 'snowflake',\n }));\n } else if (inputType.isType([\n DataTypeExprKind.FLOAT,\n DataTypeExprKind.DOUBLE,\n ])) {\n this.setType(expression, DataTypeExprKind.DOUBLE);\n } else {\n this.setType(expression, DataTypeExpr.build(`NUMBER(${MAX_PRECISION}, 12)`, {\n dialect: 'snowflake',\n }));\n }\n\n return expression;\n}\n\nfunction annotateMathWithFloatDecfloat (this: TypeAnnotator, expression: Expression): Expression {\n this.annotateByArgs(expression, [\n 'this',\n ]);\n\n const thisArg = expression.args.this;\n if (isInstanceOf(thisArg, Expression) && thisArg.isType(DataTypeExprKind.DECFLOAT)) {\n const thisType = thisArg.type;\n this.setType(expression, isInstanceOf(thisType, DataTypeExpr) ? thisType : undefined);\n } else {\n this.setType(expression, DataTypeExprKind.DOUBLE);\n }\n\n return expression;\n}\n\nfunction annotateStrToTime (this: TypeAnnotator, expression: StrToTimeExpr): StrToTimeExpr {\n const targetTypeArg = expression.args.targetType;\n const targetType = isInstanceOf(targetTypeArg, DataTypeExpr) ? targetTypeArg : DataTypeExprKind.TIMESTAMP;\n\n this.setType(expression, targetType);\n return expression;\n}\n\nexport class SnowflakeTyping {\n @cache\n static get EXPRESSION_METADATA (): ExpressionMetadata {\n const map: ExpressionMetadata = new Map(DialectTyping.EXPRESSION_METADATA);\n\n const extend = (types: (typeof Expression)[], data: Record<string, unknown>) => {\n for (const type of types) map.set(type, data);\n };\n\n extend([\n AddMonthsExpr,\n CeilExpr,\n DateTruncExpr,\n FloorExpr,\n LeftExpr,\n ModeExpr,\n PadExpr,\n RightExpr,\n RoundExpr,\n StuffExpr,\n SubstringExpr,\n TimeSliceExpr,\n TimestampTruncExpr,\n ], {\n annotator: (s: TypeAnnotator, e: Expression) => s.annotateByArgs(e, [\n 'this',\n ]),\n });\n\n extend([\n ApproxTopKExpr,\n ApproxTopKEstimateExpr,\n ArrayExpr,\n ArrayAggExpr,\n ArrayAppendExpr,\n ArrayCompactExpr,\n ArrayConcatExpr,\n ArrayConstructCompactExpr,\n ArrayPrependExpr,\n ArrayRemoveExpr,\n ArraysZipExpr,\n ArrayUniqueAggExpr,\n ArrayUnionAggExpr,\n MapKeysExpr,\n RegexpExtractAllExpr,\n SplitExpr,\n StringToArrayExpr,\n ], {\n returns: DataTypeExprKind.ARRAY,\n });\n\n extend([\n BitmapBitPositionExpr,\n BitmapBucketNumberExpr,\n BitmapCountExpr,\n FactorialExpr,\n GroupingIdExpr,\n Md5NumberLower64Expr,\n Md5NumberUpper64Expr,\n RandExpr,\n Seq8Expr,\n ZipfExpr,\n ], {\n returns: DataTypeExprKind.BIGINT,\n });\n\n extend([\n Base64DecodeBinaryExpr,\n BitmapConstructAggExpr,\n BitmapOrAggExpr,\n CompressExpr,\n DecompressBinaryExpr,\n DecryptExpr,\n DecryptRawExpr,\n EncryptExpr,\n EncryptRawExpr,\n HexStringExpr,\n Md5DigestExpr,\n Sha1DigestExpr,\n Sha2DigestExpr,\n ToBinaryExpr,\n TryBase64DecodeBinaryExpr,\n TryHexDecodeBinaryExpr,\n UnhexExpr,\n ], {\n returns: DataTypeExprKind.BINARY,\n });\n\n extend([\n BoolandExpr,\n BoolnotExpr,\n BoolorExpr,\n BoolxorAggExpr,\n EqualNullExpr,\n IsNullValueExpr,\n MapContainsKeyExpr,\n SearchExpr,\n SearchIpExpr,\n ToBooleanExpr,\n ], {\n returns: DataTypeExprKind.BOOLEAN,\n });\n\n extend([\n NextDayExpr,\n PreviousDayExpr,\n ], {\n returns: DataTypeExprKind.DATE,\n });\n\n extend([\n BitwiseAndAggExpr,\n BitwiseOrAggExpr,\n BitwiseXorAggExpr,\n RegexpCountExpr,\n RegexpInstrExpr,\n ToNumberExpr,\n ], {\n annotator: (s: TypeAnnotator, e: Expression) => s.setType(e, DataTypeExpr.build('NUMBER', {\n dialect: 'snowflake',\n })),\n });\n\n extend([\n ApproxPercentileEstimateExpr,\n ApproximateSimilarityExpr,\n CosineDistanceExpr,\n CovarPopExpr,\n CovarSampExpr,\n DotProductExpr,\n EuclideanDistanceExpr,\n ManhattanDistanceExpr,\n MonthsBetweenExpr,\n NormalExpr,\n ], {\n returns: DataTypeExprKind.DOUBLE,\n });\n\n extend([\n ToDecfloatExpr,\n TryToDecfloatExpr,\n ], {\n returns: DataTypeExprKind.DECFLOAT,\n });\n\n extend([\n AcosExpr,\n AsinExpr,\n AtanExpr,\n Atan2Expr,\n CbrtExpr,\n CosExpr,\n CotExpr,\n DegreesExpr,\n ExpExpr,\n LnExpr,\n LogExpr,\n PowExpr,\n RadiansExpr,\n RegrAvgxExpr,\n RegrAvgyExpr,\n RegrCountExpr,\n RegrInterceptExpr,\n RegrR2Expr,\n RegrSlopeExpr,\n RegrSxxExpr,\n RegrSxyExpr,\n RegrSyyExpr,\n RegrValxExpr,\n RegrValyExpr,\n SinExpr,\n SqrtExpr,\n TanExpr,\n TanhExpr,\n ], {\n annotator: (s: TypeAnnotator, e: Expression) => annotateMathWithFloatDecfloat.call(s, e),\n });\n\n extend([\n ByteLengthExpr,\n GroupingExpr,\n JarowinklerSimilarityExpr,\n MapSizeExpr,\n MinuteExpr,\n RtrimmedLengthExpr,\n SecondExpr,\n Seq1Expr,\n Seq2Expr,\n Seq4Expr,\n WidthBucketExpr,\n ], {\n returns: DataTypeExprKind.INT,\n });\n\n extend([\n ApproxPercentileAccumulateExpr,\n ApproxPercentileCombineExpr,\n ApproxTopKAccumulateExpr,\n ApproxTopKCombineExpr,\n ObjectAggExpr,\n ParseIpExpr,\n ParseUrlExpr,\n XmlGetExpr,\n ], {\n returns: DataTypeExprKind.OBJECT,\n });\n\n extend([\n MapCatExpr,\n MapDeleteExpr,\n MapInsertExpr,\n MapPickExpr,\n ], {\n returns: DataTypeExprKind.MAP,\n });\n\n map.set(ToFileExpr, {\n returns: DataTypeExprKind.FILE,\n });\n\n extend([\n TimeFromPartsExpr,\n TsOrDsToTimeExpr,\n ], {\n returns: DataTypeExprKind.TIME,\n });\n\n extend([\n CurrentTimestampExpr,\n LocaltimestampExpr,\n ], {\n returns: DataTypeExprKind.TIMESTAMPLTZ,\n });\n\n map.set(QuarterExpr, {\n returns: DataTypeExprKind.TINYINT,\n });\n\n extend([\n AiAggExpr,\n AiClassifyExpr,\n AiSummarizeAggExpr,\n Base64DecodeStringExpr,\n Base64EncodeExpr,\n CheckJsonExpr,\n CheckXmlExpr,\n CollateExpr,\n CollationExpr,\n CurrentAccountExpr,\n CurrentAccountNameExpr,\n CurrentAvailableRolesExpr,\n CurrentClientExpr,\n CurrentDatabaseExpr,\n CurrentIpAddressExpr,\n CurrentSchemasExpr,\n CurrentSecondaryRolesExpr,\n CurrentSessionExpr,\n CurrentStatementExpr,\n CurrentVersionExpr,\n CurrentTransactionExpr,\n CurrentWarehouseExpr,\n CurrentOrganizationUserExpr,\n CurrentRegionExpr,\n CurrentRoleExpr,\n CurrentRoleTypeExpr,\n CurrentOrganizationNameExpr,\n DecompressStringExpr,\n HexDecodeStringExpr,\n HexEncodeExpr,\n MonthnameExpr,\n RandstrExpr,\n RegexpExtractExpr,\n RegexpReplaceExpr,\n RepeatExpr,\n ReplaceExpr,\n SoundexExpr,\n SoundexP123Expr,\n SplitPartExpr,\n TryBase64DecodeStringExpr,\n TryHexDecodeStringExpr,\n UuidExpr,\n ], {\n returns: DataTypeExprKind.VARCHAR,\n });\n\n extend([\n MinhashExpr,\n MinhashCombineExpr,\n ], {\n returns: DataTypeExprKind.VARIANT,\n });\n\n extend([\n VarianceExpr,\n VariancePopExpr,\n ], {\n annotator: (s: TypeAnnotator, e: Expression) => annotateVariance.call(s, e),\n });\n\n map.set(ArgMaxExpr, {\n annotator: (s: TypeAnnotator, e: ArgMaxExpr) => annotateArgMaxMin.call(s, e),\n });\n map.set(ArgMinExpr, {\n annotator: (s: TypeAnnotator, e: ArgMinExpr) => annotateArgMaxMin.call(s, e),\n });\n map.set(ConcatWsExpr, {\n annotator: (s: TypeAnnotator, e: Expression) => s.annotateByArgs(e, [\n 'expressions',\n ]),\n });\n\n map.set(ConvertTimezoneExpr, {\n annotator: (s: TypeAnnotator, e: ConvertTimezoneExpr) => s.setType(\n e,\n e.args.sourceTz ? DataTypeExprKind.TIMESTAMPNTZ : DataTypeExprKind.TIMESTAMPTZ,\n ),\n });\n\n map.set(DateAddExpr, {\n annotator: (s: TypeAnnotator, e: Expression) => annotateDateOrTimeAdd.call(s, e),\n });\n map.set(DecodeCaseExpr, {\n annotator: (s: TypeAnnotator, e: DecodeCaseExpr) => annotateDecodeCase.call(s, e),\n });\n\n map.set(HashAggExpr, {\n annotator: (s: TypeAnnotator, e: Expression) => s.setType(e, DataTypeExpr.build('NUMBER(19, 0)', {\n dialect: 'snowflake',\n })),\n });\n\n map.set(KurtosisExpr, {\n annotator: (s: TypeAnnotator, e: KurtosisExpr) => annotateKurtosis.call(s, e),\n });\n map.set(MedianExpr, {\n annotator: (s: TypeAnnotator, e: MedianExpr) => annotateMedian.call(s, e),\n });\n map.set(ReverseExpr, {\n annotator: (s: TypeAnnotator, e: ReverseExpr) => annotateReverse.call(s, e),\n });\n map.set(StrToTimeExpr, {\n annotator: (s: TypeAnnotator, e: StrToTimeExpr) => annotateStrToTime.call(s, e),\n });\n map.set(TimeAddExpr, {\n annotator: (s: TypeAnnotator, e: Expression) => annotateDateOrTimeAdd.call(s, e),\n });\n map.set(TimestampFromPartsExpr, {\n annotator: (s: TypeAnnotator, e: TimestampFromPartsExpr) => annotateTimestampFromParts.call(s, e),\n });\n map.set(WithinGroupExpr, {\n annotator: (s: TypeAnnotator, e: WithinGroupExpr) => annotateWithinGroup.call(s, e),\n });\n\n return map;\n }\n}\n","import type {\n AlterSetExpr,\n ClusterExpr,\n CommandExpr,\n CurrentDateExpr,\n DateSubExpr,\n DescribeExpr,\n ExpressionOrString,\n ExpressionValue,\n FormatExpr,\n FuncExpr,\n GeneratedAsIdentityColumnConstraintExpr,\n LogExpr,\n PropertiesExpr,\n SearchExprArgs,\n TimestampSubExpr,\n TimeToStrExpr,\n UniformExpr,\n ValuesExpr,\n} from '../expressions';\nimport {\n DotExpr,\n isType,\n EndsWithExpr,\n LowerHexExpr,\n PartitionedByPropertyExpr,\n PercentileContExpr,\n PercentileDiscExpr,\n RandExpr,\n StartsWithExpr,\n StPointExpr,\n StringToArrayExpr,\n StrPositionExpr,\n StrToDateExpr,\n StuffExpr,\n TimeSliceExpr,\n DirectoryStageExpr,\n MaskingPolicyColumnConstraintExpr,\n NotExpr,\n ProjectionPolicyColumnConstraintExpr,\n TagsExpr,\n UseExpr,\n NthValueExpr, RegexpILikeExpr,\n SetExpr,\n SetItemExpr,\n ShowExpr,\n PowExpr, RegexpExtractAllExpr, RegexpLikeExpr,\n Sha1DigestExpr,\n Sha2DigestExpr,\n Sha2Expr,\n ShaExpr,\n StddevExpr,\n TableFromRowsExpr,\n TimeAddExpr,\n TimeFromPartsExpr,\n ArrayAggExpr,\n ArrayExpr,\n Expression, FromExpr, GenerateDateArrayExpr, JsonExtractExpr, JsonValueArrayExpr, LambdaExpr, LateralExpr, ParseJsonExpr, RegexpExtractExpr,\n select,\n StarExpr,\n toIdentifier,\n DateTruncExpr, IfExpr, KwargExpr, PivotAnyExpr, PivotExpr, RegexpReplaceExpr, SearchExpr, TimestampTruncExpr,\n AnonymousExpr,\n ApproxTopKExpr,\n BinaryExpr,\n BitwiseAndExpr,\n BitwiseLeftShiftExpr,\n BitwiseOrExpr,\n BitwiseRightShiftExpr,\n BitwiseXorExpr,\n CastExpr,\n DataTypeExpr,\n DataTypeExprKind,\n DateDiffExpr,\n DateFromPartsExpr,\n DivExpr,\n EqExpr,\n IdentifierExpr,\n IsExpr,\n LiteralExpr,\n NegExpr,\n null_,\n PropertyEqExpr,\n SplitPartExpr,\n StarMapExpr,\n StrToTimeExpr,\n StructExpr, TryCastExpr, TsOrDsToDateExpr, TsOrDsToTimeExpr, UnixToTimeExpr,\n wrap,\n UnnestExpr,\n SelectExpr,\n alias,\n CreateExpr,\n IcebergPropertyExpr,\n SchemaExpr,\n ColumnDefExpr,\n IntervalExpr,\n DateAddExpr,\n TableAliasExpr,\n JoinExpr,\n ToNumberExpr,\n GeneratorExpr,\n RoundExpr,\n TimestampFromPartsExpr,\n BracketExpr,\n ColumnExpr,\n TableExpr,\n LocaltimeExpr,\n AddMonthsExpr,\n ApproxQuantileExpr,\n ArrayContainsExpr,\n GenerateSeriesExpr,\n SubExpr,\n SortArrayExpr,\n FlattenExpr,\n BitwiseNotExpr,\n BitwiseAndAggExpr,\n BitwiseOrAggExpr,\n BitwiseXorAggExpr,\n BitmapOrAggExpr,\n BoolandExpr,\n BoolorExpr,\n XorExpr,\n CorrExpr,\n DayOfWeekIsoExpr,\n DaynameExpr,\n LevenshteinExpr,\n ExplodeExpr,\n GetExtractExpr,\n CurrentTimestampExpr,\n GreatestExpr,\n LeastExpr,\n UnhexExpr,\n Md5Expr,\n Md5DigestExpr,\n Md5NumberLower64Expr,\n Md5NumberUpper64Expr,\n MonthnameExpr,\n LastDayExpr,\n LengthExpr,\n JsonKeysExpr,\n ByteLengthExpr,\n ParseUrlExpr,\n DecryptExpr,\n DecryptRawExpr,\n ToBinaryExpr,\n ToBooleanExpr,\n ToDoubleExpr,\n ToFileExpr,\n JsonFormatExpr,\n CosineDistanceExpr,\n DotProductExpr,\n ManhattanDistanceExpr,\n EuclideanDistanceExpr,\n LikeExpr,\n ILikeExpr,\n SkewnessExpr,\n WeekOfYearExpr,\n WeekExpr,\n ModelAttributeExpr,\n ApproxDistinctExpr,\n ArgMaxExpr,\n ArgMinExpr,\n ArrayConcatExpr,\n ArrayAppendExpr,\n ArrayPrependExpr,\n ArrayIntersectExpr,\n AtTimeZoneExpr,\n LocaltimestampExpr,\n DatetimeAddExpr,\n DatetimeDiffExpr,\n DateStrToDateExpr,\n DayOfMonthExpr,\n DayOfWeekExpr,\n DayOfYearExpr,\n ExtractExpr,\n FileFormatPropertyExpr,\n FromTimeZoneExpr,\n GroupConcatExpr,\n JsonExtractScalarExpr,\n JsonObjectExpr,\n JsonPathRootExpr,\n JsonPathKeyExpr,\n JsonPathSubscriptExpr,\n LocationPropertyExpr,\n LogicalAndExpr,\n LogicalOrExpr,\n MapExpr,\n PutExpr,\n GetExpr,\n VarExpr,\n ForeignKeyExpr,\n SemanticViewExpr,\n CredentialsPropertyExpr,\n BoolnotExpr,\n JsonExtractArrayExpr,\n InExpr,\n QueryExpr,\n NeqExpr,\n AllExpr,\n UsingTemplatePropertyExpr,\n MakeIntervalExpr,\n MaxExpr,\n MinExpr,\n ArrayConcatAggExpr,\n YearOfWeekExpr,\n YearOfWeekIsoExpr,\n TsOrDsDiffExpr,\n ToCharExpr,\n TsOrDsAddExpr,\n ToArrayExpr,\n TimeToUnixExpr,\n TimeStrToTimeExpr,\n TimestampDiffExpr,\n TimestampAddExpr,\n TimestampExpr,\n UuidExpr,\n VarMapExpr,\n PropertiesLocation,\n VolatilePropertyExpr,\n SetPropertyExpr,\n MaterializedPropertyExpr,\n CopyGrantsPropertyExpr,\n CreateExprKind,\n OrderExpr,\n WithinGroupExpr,\n AliasExpr,\n ConvertTimezoneExpr,\n} from '../expressions';\nimport {\n Generator, unsupportedArgs,\n} from '../generator';\nimport {\n findNewName,\n isDateUnit,\n isInt, seqGet,\n} from '../helper';\nimport {\n JsonPathTokenizer,\n} from '../jsonpath';\nimport {\n annotateTypes,\n buildScope, findAllInScope,\n} from '../optimizer';\nimport {\n Parser, buildVarMap,\n} from '../parser';\nimport {\n cache, narrowInstanceOf,\n} from '../port_internals';\nimport type {\n TokenPair,\n} from '../tokens';\nimport {\n Tokenizer, TokenType,\n} from '../tokens';\nimport {\n addWithinGroupForPercentiles,\n eliminateDistinctOn,\n eliminateSemiAndAntiJoins,\n eliminateWindowClause,\n explodeProjectionToUnnest,\n inheritStructFieldNames,\n preprocess,\n unqualifyColumns,\n} from '../transforms';\nimport {\n SnowflakeTyping,\n} from '../typing/snowflake';\nimport {\n arrayConcatSql,\n arrayAppendSql,\n binaryFromFunction,\n buildFormattedTime,\n buildLike,\n buildReplaceWithOptionalReplacement,\n buildTimeToStrOrToChar,\n buildTrunc,\n dateDeltaSql,\n dateStrToDateSql,\n dateTruncToTime,\n Dialect, Dialects,\n groupConcatSql,\n ifSql,\n mapDatePart,\n NormalizationStrategy,\n renameFunc,\n strPositionSql,\n timeStrToTimeSql,\n timestampDiffSql,\n timestampTruncSql,\n varMapSql,\n buildDefaultDecimalType,\n noMakeIntervalSql,\n maxOrGreatest,\n minOrLeast,\n noTimestampSql,\n unitToStr,\n inlineArraySql,\n NullOrdering,\n} from './dialect';\n\nconst TIMESTAMP_TYPES: Partial<Record<DataTypeExprKind, string>> = {\n [DataTypeExprKind.TIMESTAMP]: 'TO_TIMESTAMP',\n [DataTypeExprKind.TIMESTAMPLTZ]: 'TO_TIMESTAMP_LTZ',\n [DataTypeExprKind.TIMESTAMPNTZ]: 'TO_TIMESTAMP_NTZ',\n [DataTypeExprKind.TIMESTAMPTZ]: 'TO_TIMESTAMP_TZ',\n};\n\nfunction buildStrtok (args: Expression[]): SplitPartExpr {\n // Add default delimiter (space) if missing - per Snowflake docs\n if (args.length === 1) {\n args.push(LiteralExpr.string(' '));\n }\n\n // Add default part_index (1) if missing\n if (args.length === 2) {\n args.push(LiteralExpr.number(1));\n }\n\n return SplitPartExpr.fromArgList(args);\n}\n\n/**\n * Normalizes APPROX_TOP_K arguments to match Snowflake semantics.\n *\n * Snowflake APPROX_TOP_K signature: APPROX_TOP_K(column [, k] [, counters])\n * - k defaults to 1 if omitted (per Snowflake documentation)\n * - counters is optional precision parameter\n */\nfunction buildApproxTopK (args: Expression[]): ApproxTopKExpr {\n // Add default k=1 if only column is provided\n if (args.length === 1) {\n args.push(LiteralExpr.number(1));\n }\n\n return ApproxTopKExpr.fromArgList(args);\n}\n\nfunction buildDateFromParts (args: Expression[]): DateFromPartsExpr {\n return new DateFromPartsExpr({\n year: seqGet(args, 0),\n month: seqGet(args, 1),\n day: seqGet(args, 2),\n allowOverflow: true,\n });\n}\n\nfunction buildDatetime (\n name: string,\n kind: DataTypeExprKind,\n options: {safe?: boolean} = {},\n) {\n const {\n safe = false,\n } = options;\n\n return (args: Expression[]): Expression => {\n const value = seqGet(args, 0);\n const scaleOrFmt = seqGet(args, 1);\n\n const intValue = value instanceof IdentifierExpr && isInt(value.name);\n const intScaleOrFmt = scaleOrFmt instanceof LiteralExpr && scaleOrFmt.isNumber;\n\n if (value instanceof LiteralExpr || value instanceof NegExpr || (value && scaleOrFmt)) {\n // Converts calls like `TO_TIME('01:02:03')` into casts\n if (args.length === 1 && value instanceof LiteralExpr && value.isString && !intValue) {\n return safe\n ? new TryCastExpr({\n this: value,\n to: DataTypeExpr.build(kind),\n requiresString: true,\n })\n : new CastExpr({\n this: value,\n to: DataTypeExpr.build(kind),\n });\n }\n\n // Handles `TO_TIMESTAMP(str, fmt)` and `TO_TIMESTAMP(num, scale)` as special\n // cases so we can transpile them, since they're relatively common\n if (kind in TIMESTAMP_TYPES) {\n if (!safe && (intScaleOrFmt || (intValue && scaleOrFmt === undefined))) {\n const unixExpr = new UnixToTimeExpr({\n this: value,\n scale: scaleOrFmt,\n });\n unixExpr.setArgKey('targetType', DataTypeExpr.build(kind, {\n dialect: 'snowflake',\n }));\n return unixExpr;\n }\n if (scaleOrFmt && !intScaleOrFmt) {\n // Format string provided (e.g., 'YYYY-MM-DD'), use StrToTime\n const strtotimeExpr = buildFormattedTime(StrToTimeExpr, {\n dialect: 'snowflake',\n })(args);\n strtotimeExpr.setArgKey('safe', safe);\n strtotimeExpr.setArgKey('targetType', DataTypeExpr.build(kind, {\n dialect: 'snowflake',\n }));\n return strtotimeExpr;\n }\n }\n }\n\n // Handle DATE/TIME with format strings - allow intValue if a format string is provided\n const hasFormatString = scaleOrFmt && !intScaleOrFmt;\n if (\n (kind === DataTypeExprKind.DATE || kind === DataTypeExprKind.TIME)\n && (!intValue || hasFormatString)\n ) {\n const Klass = kind === DataTypeExprKind.DATE ? TsOrDsToDateExpr : TsOrDsToTimeExpr;\n const formattedExp = buildFormattedTime(Klass, {\n dialect: 'snowflake',\n })(args);\n formattedExp.setArgKey('safe', safe);\n return formattedExp;\n }\n\n return new AnonymousExpr({\n this: name,\n expressions: args,\n });\n };\n}\n\nfunction buildObjectConstruct (args: Expression[]): StarMapExpr | StructExpr {\n const expression = buildVarMap(args);\n\n if (expression instanceof StarMapExpr) {\n return expression;\n }\n\n return new StructExpr({\n expressions: [\n ...expression.args.keys ?? [\n ],\n ].map(\n (k, i) => new PropertyEqExpr({\n this: k as ExpressionValue,\n expression: seqGet(expression.args.values ?? [\n ], i) as ExpressionValue,\n }),\n ),\n });\n}\n\nfunction buildDatediff (args: Expression[]): DateDiffExpr {\n return new DateDiffExpr({\n this: seqGet(args, 2),\n expression: seqGet(args, 1),\n unit: mapDatePart(seqGet(args, 0)),\n datePartBoundary: true,\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildDateTimeAdd<T extends Expression> (ExprClass: new (args: any) => T) {\n return (args: Expression[]): T => {\n return new ExprClass({\n this: seqGet(args, 2),\n expression: seqGet(args, 1),\n unit: mapDatePart(seqGet(args, 0)),\n });\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildBitwise<T extends Expression> (ExprClass: new (args: any) => T, name: string) {\n return (args: Expression[]): T | AnonymousExpr => {\n if (args.length === 3) {\n // Special handling for bitwise operations with padside argument\n if (\n ExprClass === BitwiseAndExpr as unknown\n || ExprClass === BitwiseOrExpr as unknown\n || ExprClass === BitwiseXorExpr as unknown\n ) {\n return new ExprClass({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n padside: seqGet(args, 2),\n }) as T;\n }\n return new AnonymousExpr({\n this: name,\n expressions: args,\n });\n }\n\n const result = binaryFromFunction(ExprClass)(args);\n\n // Snowflake specifies INT128 for bitwise shifts\n if (ExprClass === BitwiseLeftShiftExpr as unknown || ExprClass === BitwiseRightShiftExpr as unknown) {\n result.setArgKey('requiresInt128', true);\n }\n\n return result as T;\n };\n}\n\n// https://docs.snowflake.com/en/sql-reference/functions/div0\nfunction buildIfFromDiv0 (args: Expression[]): IfExpr {\n const lhs = wrap(seqGet(args, 0), BinaryExpr);\n const rhs = wrap(seqGet(args, 1), BinaryExpr);\n\n const cond = new EqExpr({\n this: rhs,\n expression: LiteralExpr.number(0),\n }).and(\n new IsExpr({\n this: lhs,\n expression: null_(),\n }).not(),\n );\n const trueNode = LiteralExpr.number(0);\n const falseNode = new DivExpr({\n this: lhs,\n expression: rhs,\n });\n return new IfExpr({\n this: cond,\n true: trueNode,\n false: falseNode,\n });\n}\n\n// https://docs.snowflake.com/en/sql-reference/functions/div0null\nfunction buildIfFromDiv0null (args: Expression[]): IfExpr {\n const lhs = wrap(seqGet(args, 0), BinaryExpr);\n const rhs = wrap(seqGet(args, 1), BinaryExpr);\n\n // Returns 0 when divisor is 0 OR NULL\n const cond = new EqExpr({\n this: rhs,\n expression: LiteralExpr.number(0),\n }).or(\n new IsExpr({\n this: rhs,\n expression: null_(),\n }),\n );\n const trueNode = LiteralExpr.number(0);\n const falseNode = new DivExpr({\n this: lhs,\n expression: rhs,\n });\n return new IfExpr({\n this: cond,\n true: trueNode,\n false: falseNode,\n });\n}\n\n// https://docs.snowflake.com/en/sql-reference/functions/zeroifnull\nfunction buildIfFromZeroifnull (args: Expression[]): IfExpr {\n const cond = new IsExpr({\n this: seqGet(args, 0),\n expression: null_(),\n });\n return new IfExpr({\n this: cond,\n true: LiteralExpr.number(0),\n false: seqGet(args, 0),\n });\n}\n\nfunction buildSearch (args: Expression[]): SearchExpr {\n const kwargs: SearchExprArgs = {\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n };\n\n args.slice(2).forEach((arg) => {\n if (arg instanceof KwargExpr) {\n (kwargs as Record<string, unknown>)[arg.name] = arg;\n }\n });\n\n return new SearchExpr(kwargs);\n}\n\n// https://docs.snowflake.com/en/sql-reference/functions/nullifzero\nfunction buildIfFromNullifzero (args: Expression[]): IfExpr {\n const cond = new EqExpr({\n this: seqGet(args, 0),\n expression: LiteralExpr.number(0),\n });\n return new IfExpr({\n this: cond,\n true: null_(),\n false: seqGet(args, 0),\n });\n}\n\nfunction regexpILikeSql (this: Generator, expression: RegexpILikeExpr): string {\n let flag = expression.text('flag');\n\n if (!flag.includes('i')) {\n flag += 'i';\n }\n\n return this.func(\n 'REGEXP_LIKE',\n [\n expression.args.this,\n expression.args.expression,\n LiteralExpr.string(flag),\n ],\n );\n}\n\nfunction buildRegexpReplace (args: Expression[]): RegexpReplaceExpr {\n const regexpReplace = RegexpReplaceExpr.fromArgList(args);\n\n if (!regexpReplace.args.replacement) {\n regexpReplace.setArgKey('replacement', LiteralExpr.string(''));\n }\n\n return regexpReplace;\n}\n\nfunction showParser (str: string) {\n return function (this: Parser): ShowExpr {\n return (this as SnowflakeParser).parseShowSnowflake(str);\n };\n}\n\nfunction dateTruncToTimeWrapper (args: Expression[]): DateTruncExpr | TimestampTruncExpr {\n const trunc = dateTruncToTime(args);\n const unit = mapDatePart(trunc.args.unit);\n trunc.setArgKey('unit', unit);\n\n const isTimeInput = trunc.args.this?.isType([\n DataTypeExprKind.TIME,\n DataTypeExprKind.TIMETZ,\n ]);\n\n const needsTypePreservation =\n (trunc instanceof TimestampTruncExpr && (isDateUnit(unit) || isTimeInput))\n || (trunc instanceof DateTruncExpr && !isDateUnit(unit));\n\n if (needsTypePreservation) {\n trunc.setArgKey('inputTypePreserved', true);\n }\n return trunc;\n}\n\n/**\n * Snowflake doesn't allow columns referenced in UNPIVOT to be qualified,\n * so we need to unqualify them. Same goes for ANY ORDER BY <column>.\n */\nfunction unqualifyPivotColumns (expression: Expression): Expression {\n if (expression instanceof PivotExpr) {\n if (expression.args.unpivot) {\n return unqualifyColumns(expression);\n } else {\n expression.args.fields?.forEach((field) => {\n const fieldExpr = seqGet(field?.args.expressions || [\n ], 0);\n\n if (fieldExpr instanceof PivotAnyExpr) {\n const unqualifiedFieldExpr = unqualifyColumns(fieldExpr);\n field?.setArgKey('expressions', [\n unqualifiedFieldExpr,\n ], 0);\n }\n });\n }\n }\n\n return expression;\n}\n\nfunction flattenStructuredTypesUnlessIceberg (expression: Expression): Expression {\n if (!(expression instanceof CreateExpr)) return expression;\n\n const flattenStructuredType = (node: Expression): Expression => {\n if (node instanceof DataTypeExpr && DataTypeExpr.NESTED_TYPES.has(node.args.this?.toString() as DataTypeExprKind)) {\n node.setArgKey('expressions', undefined);\n }\n return node;\n };\n\n const props = expression.args.properties;\n const isIceberg = props?.find(IcebergPropertyExpr);\n\n if (expression.args.this instanceof SchemaExpr && !isIceberg) {\n for (const schemaExpression of expression.args.this.args.expressions || [\n ]) {\n if (schemaExpression instanceof ColumnDefExpr && schemaExpression.args.kind instanceof DataTypeExpr) {\n schemaExpression.args.kind.transform(flattenStructuredType, {\n copy: false,\n });\n }\n }\n }\n\n return expression;\n}\n\nfunction unnestGenerateDateArray (unnest: UnnestExpr): void {\n const generateDateArray = unnest.args.expressions?.[0] as GenerateDateArrayExpr;\n const {\n start, end, step,\n } = generateDateArray.args;\n\n if (!start || !end || !(step instanceof IntervalExpr) || step.name !== '1') {\n return;\n }\n\n const unit = step.args.unit;\n if (!unit) return;\n const unnestAlias = unnest.args.alias;\n const sequenceValueName = narrowInstanceOf(unnestAlias, TableAliasExpr)?.args.columns?.[0] || 'value';\n\n const dateAdd = buildDateTimeAdd(DateAddExpr)([\n unit,\n new CastExpr({\n this: sequenceValueName,\n to: DataTypeExpr.build(DataTypeExprKind.INT),\n }),\n new CastExpr({\n this: start,\n to: DataTypeExpr.build(DataTypeExprKind.DATE),\n }),\n ]);\n\n const numberSequence = (SnowflakeParser.FUNCTIONS['ARRAY_GENERATE_RANGE'] as (args: Expression[]) => Expression)([\n LiteralExpr.number(0),\n buildDatediff([\n unit,\n start,\n end,\n ]).add(1),\n ]);\n\n unnest.setArgKey('expressions', [\n numberSequence,\n ]);\n\n const unnestParent = unnest.parent;\n if (unnestParent instanceof JoinExpr) {\n const select = unnestParent.parent;\n if (select instanceof SelectExpr) {\n const replaceColumnName = sequenceValueName instanceof Expression ? sequenceValueName.name : sequenceValueName.toString();\n const scope = buildScope(select);\n if (scope) {\n for (const column of scope.columns) {\n if (column.name.toLowerCase() === replaceColumnName.toLowerCase()) {\n column.replace(\n column.parent instanceof SelectExpr ? dateAdd.as(replaceColumnName) : dateAdd,\n );\n }\n }\n }\n\n const lateral = new LateralExpr({\n this: unnestParent.args.this?.pop(),\n });\n unnestParent.replace(new JoinExpr({\n this: lateral,\n }));\n }\n } else {\n unnest.replace(\n select(dateAdd.as(sequenceValueName as string | IdentifierExpr))\n .from(unnest.copy())\n .subquery(unnestAlias),\n );\n }\n}\n\nfunction transformGenerateDateArray (expression: Expression): Expression {\n if (expression instanceof SelectExpr) {\n for (const generateDateArray of expression.findAll(GenerateDateArrayExpr)) {\n const parent = generateDateArray.parent;\n\n if (!(parent instanceof UnnestExpr)) {\n const unnest = new UnnestExpr({\n expressions: [\n generateDateArray.copy(),\n ],\n });\n generateDateArray.replace(\n select(new ArrayAggExpr({\n this: new StarExpr({}),\n })).from(unnest)\n .subquery(),\n );\n }\n\n if (\n parent instanceof UnnestExpr\n && (parent.parent instanceof FromExpr || parent.parent instanceof JoinExpr)\n && parent.args.expressions?.length === 1\n ) {\n unnestGenerateDateArray(parent);\n }\n }\n }\n\n return expression;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildRegexpExtract<T extends Expression> (ExprClass: new (args: any) => T) {\n return (args: Expression[], {\n dialect,\n }: {dialect: Dialect}): T => {\n return new ExprClass({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n position: seqGet(args, 2),\n occurrence: seqGet(args, 3),\n parameters: seqGet(args, 4),\n group: seqGet(args, 5) || LiteralExpr.number(0),\n ...(ExprClass === RegexpExtractExpr as unknown\n ? {\n nullIfPosOverflow: dialect._constructor.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL,\n }\n : {}),\n });\n };\n}\n\nfunction regexpExtractSql (this: Generator, expression: RegexpExtractExpr | RegexpExtractAllExpr): string {\n let group = expression.args.group;\n\n if (group) {\n if (\n (group instanceof IdentifierExpr && group.name === '0')\n || (group instanceof LiteralExpr && String(group.args.this) === '0')\n ) {\n group = undefined;\n }\n }\n\n const parameters = expression.args.parameters || (group ? LiteralExpr.string('c') : undefined);\n const occurrence = expression.args.occurrence || (parameters ? LiteralExpr.number(1) : undefined);\n const position = expression.args.position || (occurrence ? LiteralExpr.number(1) : undefined);\n\n return this.func(\n expression instanceof RegexpExtractExpr ? 'REGEXP_SUBSTR' : 'REGEXP_EXTRACT_ALL',\n [\n expression.args.this,\n expression.args.expression,\n position,\n occurrence,\n parameters,\n group,\n ],\n );\n}\n\nfunction jsonExtractValueArraySql (\n this: Generator,\n expression: JsonValueArrayExpr | JsonExtractArrayExpr,\n): string {\n const jsonExtract = new JsonExtractExpr({\n this: expression.args.this,\n expression: expression.args.expression,\n });\n const ident = toIdentifier('x');\n\n const thisNode: Expression =\n expression instanceof JsonValueArrayExpr\n ? new CastExpr({\n this: ident,\n to: DataTypeExpr.build(DataTypeExprKind.VARCHAR),\n })\n : new ParseJsonExpr({\n this: `TO_JSON(${ident})`,\n });\n\n const transformLambda = new LambdaExpr({\n expressions: [\n ident,\n ],\n this: thisNode,\n });\n\n return this.func('TRANSFORM', [\n jsonExtract,\n transformLambda,\n ]);\n}\n\nfunction qualifyUnnestedColumns (expression: Expression): Expression {\n if (!(expression instanceof SelectExpr)) return expression;\n\n const scope = buildScope(expression);\n if (!scope) return expression;\n\n const unnests = Array.from(scope.findAll(UnnestExpr));\n if (unnests.length === 0) return expression;\n\n const takenSourceNames = new Set(scope.sources.keys());\n const columnSource: Record<string, ExpressionValue<IdentifierExpr>> = {};\n const unnestToIdentifier = new Map<Expression, IdentifierExpr>();\n\n let unnestIdentifier: ExpressionValue<IdentifierExpr> | undefined;\n const origExpression = expression.copy();\n\n for (const unnest of unnests) {\n if (!(unnest.parent instanceof FromExpr || unnest.parent instanceof JoinExpr)) continue;\n\n const unnestColumns = new Set<string>();\n for (const unnestExpr of unnest.args.expressions || [\n ]) {\n if (!(unnestExpr instanceof ArrayExpr)) continue;\n\n for (const arrayExpr of unnestExpr.args.expressions || [\n ]) {\n if (\n arrayExpr instanceof StructExpr\n && 0 < (arrayExpr.args.expressions || [\n ]).length\n && arrayExpr.args.expressions?.every((e) => e instanceof PropertyEqExpr)\n ) {\n arrayExpr.args.expressions.forEach((structExpr) => {\n unnestColumns.add(\n structExpr.args.this instanceof Expression\n ? structExpr.args.this.name.toLowerCase()\n : structExpr.args.this?.toString().toLowerCase() ?? '',\n );\n });\n break;\n }\n }\n if (0 < unnestColumns.size) break;\n }\n\n const unnestAlias = unnest.args.alias;\n if (!unnestAlias) {\n const aliasName = findNewName(takenSourceNames, 'value');\n takenSourceNames.add(aliasName);\n\n const aliasedUnnest = alias(unnest, undefined, {\n table: [\n aliasName,\n ],\n });\n scope.replace(unnest, aliasedUnnest);\n unnestIdentifier = narrowInstanceOf(aliasedUnnest.args.alias, TableAliasExpr)?.args.columns?.[0];\n } else {\n const narrowedUnnestAlias = narrowInstanceOf(unnestAlias, TableAliasExpr);\n const aliasColumns = narrowedUnnestAlias?.args.columns || [\n ];\n unnestIdentifier = narrowedUnnestAlias?.args.this || seqGet(aliasColumns, 0);\n }\n\n if (!(unnestIdentifier instanceof IdentifierExpr)) return origExpression;\n\n unnestToIdentifier.set(unnest, unnestIdentifier);\n unnestColumns.forEach((c) => {\n if (unnestIdentifier) columnSource[c.toLowerCase()] = unnestIdentifier;\n });\n }\n\n for (const column of scope.columns) {\n if (column.args.table) continue;\n const unnestIdentifierName = unnestIdentifier instanceof Expression ? unnestIdentifier.name : unnestIdentifier?.toString();\n\n let table = columnSource[column.name.toLowerCase()];\n if (\n unnestIdentifier\n && !table\n && scope.sources.size === 1\n && column.name.toLowerCase() !== unnestIdentifierName?.toLowerCase()\n ) {\n const unnestAncestor = column.findAncestor<UnnestExpr | SelectExpr>(UnnestExpr, SelectExpr);\n const ancestorIdentifier = unnestAncestor ? unnestToIdentifier.get(unnestAncestor) : undefined;\n if (\n unnestAncestor instanceof UnnestExpr\n && ancestorIdentifier\n && ancestorIdentifier.name.toLowerCase() === unnestIdentifierName?.toLowerCase()\n ) {\n continue;\n }\n table = unnestIdentifier;\n }\n\n if (table) column.setArgKey('table', table instanceof Expression ? table.copy() : table);\n }\n\n return expression;\n}\n\n/**\n * This transformation is used to facilitate transpilation of BigQuery `UNNEST` operations\n * to Snowflake. It should not affect roundtrip because `Unnest` nodes cannot be produced\n * by Snowflake's parser.\n */\nfunction eliminateDotVariantLookup (expression: Expression): Expression {\n if (expression instanceof SelectExpr) {\n const unnestAliases = new Set<string>();\n\n for (const unnest of findAllInScope(expression, [\n UnnestExpr,\n ])) {\n const unnestAlias = unnest.args.alias;\n if (\n unnestAlias instanceof TableAliasExpr\n && !unnestAlias.args.this\n && unnestAlias.args.columns?.length === 1\n ) {\n unnestAliases.add(unnestAlias.args.columns[0] instanceof Expression ? unnestAlias.args.columns[0].name : unnestAlias.args.columns[0].toString());\n }\n }\n\n if (0 < unnestAliases.size) {\n for (const c of findAllInScope(expression, [\n ColumnExpr,\n ])) {\n if (c.args.table instanceof Expression && unnestAliases.has(c.args.table.name)) {\n const bracketLhs = c.args.table;\n const bracketRhs = LiteralExpr.string(c.name);\n const bracket = new BracketExpr({\n this: bracketLhs,\n expressions: [\n bracketRhs,\n ],\n });\n\n if (c.parent === expression) {\n // Retain column projection names by using aliases\n c.replace(alias(bracket, c.args.this instanceof Expression ? c.args.this.copy() as IdentifierExpr : c.args.this?.toString()));\n } else {\n c.replace(bracket);\n }\n }\n }\n }\n }\n\n return expression;\n}\n\n/**\n * Build TimestampFromParts with support for both syntaxes:\n * 1. TIMESTAMP_FROM_PARTS(year, month, day, hour, minute, second [, nanosecond] [, time_zone])\n * 2. TIMESTAMP_FROM_PARTS(date_expr, time_expr) - Snowflake specific\n */\nfunction buildTimestampFromParts (args: Expression[]): FuncExpr {\n if (args.length === 2) {\n return new TimestampFromPartsExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n });\n }\n\n return TimestampFromPartsExpr.fromArgList(args);\n}\n\n/**\n * Build Round expression, unwrapping Snowflake's named parameters.\n * Maps EXPR => this, SCALE => decimals, ROUNDING_MODE => truncate.\n */\nfunction buildRound (args: Expression[]): RoundExpr {\n const kwargMap: Record<string, string> = {\n EXPR: 'this',\n SCALE: 'decimals',\n ROUNDING_MODE: 'truncate',\n };\n const roundArgs: Record<string, unknown> = {};\n const positionalKeys = [\n 'this',\n 'decimals',\n 'truncate',\n ];\n let positionalIdx = 0;\n\n for (const arg of args) {\n if (arg instanceof KwargExpr) {\n const key = arg.args.this?.name.toUpperCase();\n const roundKey = key !== undefined ? kwargMap[key] : undefined;\n if (roundKey) {\n roundArgs[roundKey] = arg.args.expression;\n }\n } else {\n if (positionalIdx < positionalKeys.length) {\n roundArgs[positionalKeys[positionalIdx]] = arg;\n positionalIdx++;\n }\n }\n }\n\n const expression = new RoundExpr(roundArgs);\n expression.setArgKey('castsNonIntegerDecimals', true);\n return expression;\n}\n\n/**\n * Build Generator expression, unwrapping Snowflake's named parameters.\n * Maps ROWCOUNT => rowcount, TIMELIMIT => time_limit.\n */\nfunction buildGenerator (args: Expression[]): GeneratorExpr {\n const kwargMap: Record<string, string> = {\n ROWCOUNT: 'rowcount',\n TIMELIMIT: 'timeLimit',\n };\n const genArgs: Record<string, unknown> = {};\n\n for (const arg of args) {\n if (arg instanceof KwargExpr) {\n const key = arg.args.this?.name.toUpperCase();\n const genKey = key !== undefined ? kwargMap[key] : undefined;\n if (genKey) {\n genArgs[genKey] = arg.args.expression;\n }\n }\n }\n\n return new GeneratorExpr(genArgs);\n}\n\nfunction buildTryToNumber (args: Expression[]): ToNumberExpr {\n return new ToNumberExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n precision: seqGet(args, 2),\n scale: seqGet(args, 3),\n safe: true,\n });\n}\n\nclass SnowflakeJsonPathTokenizer extends JsonPathTokenizer {\n @cache\n static get SINGLE_TOKENS (): Record<string, TokenType> {\n const tokens: Record<string, TokenType> = {\n ...JsonPathTokenizer.SINGLE_TOKENS,\n };\n delete tokens['$'];\n return tokens;\n }\n}\n\nclass SnowflakeTokenizer extends Tokenizer {\n @cache\n static get STRING_ESCAPES () {\n return [\n '\\\\',\n '\\'',\n ];\n }\n\n @cache\n static get HEX_STRINGS (): [string, string][] {\n return [\n [\n 'x\\'',\n '\\'',\n ],\n [\n 'X\\'',\n '\\'',\n ],\n ];\n }\n\n @cache\n static get RAW_STRINGS () {\n return [\n '$$',\n ];\n }\n\n @cache\n static get COMMENTS (): TokenPair[] {\n return [\n '--',\n '//',\n [\n '/*',\n '*/',\n ],\n ];\n }\n\n static NESTED_COMMENTS = false;\n\n @cache\n static get ORIGINAL_KEYWORDS (): Record<string, TokenType> {\n const keywords: Record<string, TokenType> = {\n ...Tokenizer.KEYWORDS,\n 'BYTEINT': TokenType.INT,\n 'FILE://': TokenType.URI_START,\n 'FILE FORMAT': TokenType.FILE_FORMAT,\n 'GET': TokenType.GET,\n 'MATCH_CONDITION': TokenType.MATCH_CONDITION,\n 'MATCH_RECOGNIZE': TokenType.MATCH_RECOGNIZE,\n 'MINUS': TokenType.EXCEPT,\n 'NCHAR VARYING': TokenType.VARCHAR,\n 'PUT': TokenType.PUT,\n 'REMOVE': TokenType.COMMAND,\n 'RM': TokenType.COMMAND,\n 'SAMPLE': TokenType.TABLE_SAMPLE,\n 'SEMANTIC VIEW': TokenType.SEMANTIC_VIEW,\n 'SQL_DOUBLE': TokenType.DOUBLE,\n 'SQL_VARCHAR': TokenType.VARCHAR,\n 'STAGE': TokenType.STAGE,\n 'STORAGE INTEGRATION': TokenType.STORAGE_INTEGRATION,\n 'STREAMLIT': TokenType.STREAMLIT,\n 'TAG': TokenType.TAG,\n 'TIMESTAMP_TZ': TokenType.TIMESTAMPTZ,\n 'TOP': TokenType.TOP,\n 'WAREHOUSE': TokenType.WAREHOUSE,\n 'FLOAT': TokenType.DOUBLE,\n };\n delete keywords['/*+'];\n return keywords;\n }\n\n @cache\n static get SINGLE_TOKENS (): Record<string, TokenType> {\n return {\n ...Tokenizer.SINGLE_TOKENS,\n '$': TokenType.PARAMETER,\n '!': TokenType.EXCLAMATION,\n };\n }\n\n @cache\n static get VAR_SINGLE_TOKENS () {\n return new Set([\n '$',\n ]);\n }\n\n @cache\n static get COMMANDS (): Set<TokenType> {\n return new Set(\n Array.from(Tokenizer.COMMANDS).filter((t) => t !== TokenType.SHOW),\n );\n }\n}\n\nclass SnowflakeParser extends Parser {\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ID_VAR_TOKENS,\n TokenType.SESSION_USER,\n TokenType.CURRENT_CATALOG,\n TokenType.EXCEPT,\n TokenType.MATCH_CONDITION,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n\n static IDENTIFY_PIVOT_STRINGS = true;\n static DEFAULT_SAMPLING_METHOD = 'BERNOULLI' as const;\n static COLON_IS_VARIANT_EXTRACT = true;\n static JSON_EXTRACT_REQUIRES_JSON_EXPRESSION = true;\n\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return (() => {\n const s = new Set([\n ...Parser.TABLE_ALIAS_TOKENS,\n TokenType.WINDOW,\n TokenType.STRAIGHT_JOIN,\n ]);\n s.delete(TokenType.MATCH_CONDITION);\n return s;\n })();\n }\n\n @cache\n static get COLON_PLACEHOLDER_TOKENS (): Set<TokenType> {\n return new Set([\n ...SnowflakeParser.ID_VAR_TOKENS,\n TokenType.NUMBER,\n ]);\n }\n\n @cache\n static get NO_PAREN_FUNCTIONS (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.NO_PAREN_FUNCTIONS,\n [TokenType.CURRENT_TIME]: LocaltimeExpr,\n };\n }\n\n @cache\n static get FUNCTIONS (): Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> {\n return (() => {\n const functions: Record<string, (args: Expression[], options: {dialect: Dialect}) => Expression> = {\n ...Parser.FUNCTIONS,\n ADD_MONTHS: (args: Expression[]) =>\n new AddMonthsExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n preserveEndOfMonth: true,\n }),\n APPROX_PERCENTILE: (args: unknown[]) => ApproxQuantileExpr.fromArgList(args),\n CURRENT_TIME: (args: Expression[]) => new LocaltimeExpr({\n this: seqGet(args, 0),\n }),\n APPROX_TOP_K: buildApproxTopK,\n ARRAY_CONSTRUCT: (args: Expression[]) => new ArrayExpr({\n expressions: args,\n }),\n ARRAY_CONTAINS: (args: Expression[]) =>\n new ArrayContainsExpr({\n this: seqGet(args, 1),\n expression: seqGet(args, 0),\n ensureVariant: false,\n }),\n ARRAY_GENERATE_RANGE: (args: Expression[]) =>\n new GenerateSeriesExpr({\n start: seqGet(args, 0),\n end: new SubExpr({\n this: seqGet(args, 1),\n expression: LiteralExpr.number(1),\n }),\n step: seqGet(args, 2),\n }),\n ARRAY_SORT: (args: unknown[]) => SortArrayExpr.fromArgList(args),\n ARRAY_FLATTEN: (args: unknown[]) => FlattenExpr.fromArgList(args),\n BITAND: buildBitwise(BitwiseAndExpr, 'BITAND'),\n BIT_AND: buildBitwise(BitwiseAndExpr, 'BITAND'),\n BITNOT: (args: Expression[]) => new BitwiseNotExpr({\n this: seqGet(args, 0),\n }),\n BIT_NOT: (args: Expression[]) => new BitwiseNotExpr({\n this: seqGet(args, 0),\n }),\n BITXOR: buildBitwise(BitwiseXorExpr, 'BITXOR'),\n BIT_XOR: buildBitwise(BitwiseXorExpr, 'BITXOR'),\n BITOR: buildBitwise(BitwiseOrExpr, 'BITOR'),\n BIT_OR: buildBitwise(BitwiseOrExpr, 'BITOR'),\n BITSHIFTLEFT: buildBitwise(BitwiseLeftShiftExpr, 'BITSHIFTLEFT'),\n BIT_SHIFTLEFT: buildBitwise(BitwiseLeftShiftExpr, 'BIT_SHIFTLEFT'),\n BITSHIFTRIGHT: buildBitwise(BitwiseRightShiftExpr, 'BITSHIFTRIGHT'),\n BIT_SHIFTRIGHT: buildBitwise(BitwiseRightShiftExpr, 'BITSHIFTRIGHT'),\n BITANDAGG: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BITAND_AGG: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BIT_AND_AGG: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BIT_ANDAGG: (args: unknown[]) => BitwiseAndAggExpr.fromArgList(args),\n BITORAGG: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BITOR_AGG: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BIT_OR_AGG: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BIT_ORAGG: (args: unknown[]) => BitwiseOrAggExpr.fromArgList(args),\n BITXORAGG: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n BITXOR_AGG: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n BIT_XOR_AGG: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n BIT_XORAGG: (args: unknown[]) => BitwiseXorAggExpr.fromArgList(args),\n BITMAP_OR_AGG: (args: unknown[]) => BitmapOrAggExpr.fromArgList(args),\n BOOLAND: (args: Expression[]) =>\n new BoolandExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n roundInput: true,\n }),\n BOOLOR: (args: Expression[]) =>\n new BoolorExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n roundInput: true,\n }),\n BOOLNOT: (args: Expression[]) => new BoolnotExpr({\n this: seqGet(args, 0),\n roundInput: true,\n }),\n BOOLXOR: (args: Expression[]) =>\n new XorExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n roundInput: true,\n }),\n CORR: (args: Expression[]) =>\n new CorrExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n nullOnZeroVariance: true,\n }),\n DATE: buildDatetime('DATE', DataTypeExprKind.DATE),\n DATEFROMPARTS: buildDateFromParts,\n DATE_FROM_PARTS: buildDateFromParts,\n DATE_TRUNC: dateTruncToTimeWrapper,\n DATEADD: buildDateTimeAdd(DateAddExpr),\n DATEDIFF: buildDatediff,\n DAYNAME: (args: Expression[]) => new DaynameExpr({\n this: seqGet(args, 0),\n abbreviated: true,\n }),\n DAYOFWEEKISO: (args: unknown[]) => DayOfWeekIsoExpr.fromArgList(args),\n DIV0: buildIfFromDiv0,\n DIV0NULL: buildIfFromDiv0null,\n EDITDISTANCE: (args: Expression[]) =>\n new LevenshteinExpr({\n this: seqGet(args, 0),\n expression: seqGet(args, 1),\n maxDist: seqGet(args, 2),\n }),\n FLATTEN: (args: unknown[]) => ExplodeExpr.fromArgList(args),\n GENERATOR: buildGenerator,\n GET: (args: unknown[]) => GetExtractExpr.fromArgList(args),\n GETDATE: (args: unknown[]) => CurrentTimestampExpr.fromArgList(args),\n GET_PATH: (args: Expression[], {\n dialect,\n }: {dialect: Dialect}) =>\n new JsonExtractExpr({\n this: seqGet(args, 0),\n expression: dialect.toJsonPath(seqGet(args, 1)),\n requiresJson: true,\n }),\n GREATEST_IGNORE_NULLS: (args: Expression[]) =>\n new GreatestExpr({\n this: seqGet(args, 0),\n expressions: args.slice(1),\n ignoreNulls: true,\n }),\n LEAST_IGNORE_NULLS: (args: Expression[]) =>\n new LeastExpr({\n this: seqGet(args, 0),\n expressions: args.slice(1),\n ignoreNulls: true,\n }),\n HEX_DECODE_BINARY: (args: unknown[]) => UnhexExpr.fromArgList(args),\n IFF: (args: unknown[]) => IfExpr.fromArgList(args),\n MD5_HEX: (args: unknown[]) => Md5Expr.fromArgList(args),\n MD5_BINARY: (args: unknown[]) => Md5DigestExpr.fromArgList(args),\n MD5_NUMBER_LOWER64: (args: unknown[]) => Md5NumberLower64Expr.fromArgList(args),\n MD5_NUMBER_UPPER64: (args: unknown[]) => Md5NumberUpper64Expr.fromArgList(args),\n MONTHNAME: (args: Expression[]) => new MonthnameExpr({\n this: seqGet(args, 0),\n abbreviated: true,\n }),\n LAST_DAY: (args: Expression[]) =>\n new LastDayExpr({\n this: seqGet(args, 0),\n unit: mapDatePart(seqGet(args, 1)),\n }),\n LEN: (args: Expression[]) => new LengthExpr({\n this: seqGet(args, 0),\n binary: true,\n }),\n LENGTH: (args: Expression[]) => new LengthExpr({\n this: seqGet(args, 0),\n binary: true,\n }),\n LOCALTIMESTAMP: (args: unknown[]) => CurrentTimestampExpr.fromArgList(args),\n NULLIFZERO: buildIfFromNullifzero,\n OBJECT_CONSTRUCT: buildObjectConstruct,\n OBJECT_KEYS: (args: unknown[]) => JsonKeysExpr.fromArgList(args),\n OCTET_LENGTH: (args: unknown[]) => ByteLengthExpr.fromArgList(args),\n PARSE_URL: (args: Expression[]) =>\n new ParseUrlExpr({\n this: seqGet(args, 0),\n permissive: seqGet(args, 1),\n }),\n REGEXP_EXTRACT_ALL: buildRegexpExtract(RegexpExtractAllExpr),\n REGEXP_REPLACE: buildRegexpReplace,\n REGEXP_SUBSTR: buildRegexpExtract(RegexpExtractExpr),\n REGEXP_SUBSTR_ALL: buildRegexpExtract(RegexpExtractAllExpr),\n REPLACE: buildReplaceWithOptionalReplacement,\n RLIKE: (args: unknown[]) => RegexpLikeExpr.fromArgList(args),\n ROUND: buildRound,\n SHA1_BINARY: (args: unknown[]) => Sha1DigestExpr.fromArgList(args),\n SHA1_HEX: (args: unknown[]) => ShaExpr.fromArgList(args),\n SHA2_BINARY: (args: unknown[]) => Sha2DigestExpr.fromArgList(args),\n SHA2_HEX: (args: unknown[]) => Sha2Expr.fromArgList(args),\n SQUARE: (args: Expression[]) =>\n new PowExpr({\n this: seqGet(args, 0),\n expression: LiteralExpr.number(2),\n }),\n STDDEV_SAMP: (args: unknown[]) => StddevExpr.fromArgList(args),\n STRTOK: buildStrtok,\n SYSDATE: (args: Expression[]) =>\n new CurrentTimestampExpr({\n this: seqGet(args, 0),\n sysdate: true,\n }),\n TABLE: (args: Expression[]) => new TableFromRowsExpr({\n this: seqGet(args, 0),\n }),\n TIME_ADD: buildDateTimeAdd(TimeAddExpr),\n TIMEADD: buildDateTimeAdd(TimeAddExpr),\n TIMEDIFF: buildDatediff,\n TIME_FROM_PARTS: (args: Expression[]) =>\n new TimeFromPartsExpr({\n hour: seqGet(args, 0),\n min: seqGet(args, 1),\n sec: seqGet(args, 2),\n nano: seqGet(args, 3),\n overflow: true,\n }),\n TIMEFROMPARTS: (args: Expression[]) =>\n new TimeFromPartsExpr({\n hour: seqGet(args, 0),\n min: seqGet(args, 1),\n sec: seqGet(args, 2),\n nano: seqGet(args, 3),\n overflow: true,\n }),\n TIMESTAMPADD: buildDateTimeAdd(DateAddExpr),\n TIMESTAMPDIFF: buildDatediff,\n TIMESTAMPFROMPARTS: buildTimestampFromParts,\n TIMESTAMP_FROM_PARTS: buildTimestampFromParts,\n TIMESTAMPNTZFROMPARTS: buildTimestampFromParts,\n TIMESTAMP_NTZ_FROM_PARTS: buildTimestampFromParts,\n TRUNC: (args: Expression[], {\n dialect,\n }: {dialect: Dialect}) =>\n buildTrunc(args, {\n dialect,\n dateTruncRequiresPart: false,\n }),\n TRUNCATE: (args: Expression[], {\n dialect,\n }: {dialect: Dialect}) =>\n buildTrunc(args, {\n dialect,\n dateTruncRequiresPart: false,\n }),\n TRY_DECRYPT: (args: Expression[]) =>\n new DecryptExpr({\n this: seqGet(args, 0),\n passphrase: seqGet(args, 1),\n aad: seqGet(args, 2),\n encryptionMethod: seqGet(args, 3),\n safe: true,\n }),\n TRY_DECRYPT_RAW: (args: Expression[]) =>\n new DecryptRawExpr({\n this: seqGet(args, 0),\n key: seqGet(args, 1),\n iv: seqGet(args, 2),\n aad: seqGet(args, 3),\n encryptionMethod: seqGet(args, 4),\n aead: seqGet(args, 5),\n safe: true,\n }),\n TRY_PARSE_JSON: (args: Expression[]) => new ParseJsonExpr({\n this: seqGet(args, 0),\n safe: true,\n }),\n TRY_TO_BINARY: (args: Expression[]) =>\n new ToBinaryExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n safe: true,\n }),\n TRY_TO_BOOLEAN: (args: Expression[]) => new ToBooleanExpr({\n this: seqGet(args, 0),\n safe: true,\n }),\n TRY_TO_DATE: buildDatetime('TRY_TO_DATE', DataTypeExprKind.DATE, {\n safe: true,\n }),\n TRY_TO_DECIMAL: buildTryToNumber,\n TRY_TO_NUMBER: buildTryToNumber,\n TRY_TO_NUMERIC: buildTryToNumber,\n TRY_TO_DOUBLE: (args: Expression[]) =>\n new ToDoubleExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n safe: true,\n }),\n TRY_TO_FILE: (args: Expression[]) =>\n new ToFileExpr({\n this: seqGet(args, 0),\n path: seqGet(args, 1),\n safe: true,\n }),\n TRY_TO_TIME: buildDatetime('TRY_TO_TIME', DataTypeExprKind.TIME, {\n safe: true,\n }),\n TRY_TO_TIMESTAMP: buildDatetime('TRY_TO_TIMESTAMP', DataTypeExprKind.TIMESTAMP, {\n safe: true,\n }),\n TRY_TO_TIMESTAMP_LTZ: buildDatetime('TRY_TO_TIMESTAMP_LTZ', DataTypeExprKind.TIMESTAMPLTZ, {\n safe: true,\n }),\n TRY_TO_TIMESTAMP_NTZ: buildDatetime('TRY_TO_TIMESTAMP_NTZ', DataTypeExprKind.TIMESTAMPNTZ, {\n safe: true,\n }),\n TRY_TO_TIMESTAMP_TZ: buildDatetime('TRY_TO_TIMESTAMP_TZ', DataTypeExprKind.TIMESTAMPTZ, {\n safe: true,\n }),\n TO_CHAR: buildTimeToStrOrToChar,\n TO_DATE: buildDatetime('TO_DATE', DataTypeExprKind.DATE),\n TO_DECIMAL: (args: Expression[]) =>\n new ToNumberExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n precision: seqGet(args, 2),\n scale: seqGet(args, 3),\n }),\n TO_NUMBER: (args: Expression[]) =>\n new ToNumberExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n precision: seqGet(args, 2),\n scale: seqGet(args, 3),\n }),\n TO_NUMERIC: (args: Expression[]) =>\n new ToNumberExpr({\n this: seqGet(args, 0),\n format: seqGet(args, 1),\n precision: seqGet(args, 2),\n scale: seqGet(args, 3),\n }),\n TO_TIME: buildDatetime('TO_TIME', DataTypeExprKind.TIME),\n TO_TIMESTAMP: buildDatetime('TO_TIMESTAMP', DataTypeExprKind.TIMESTAMP),\n TO_TIMESTAMP_LTZ: buildDatetime('TO_TIMESTAMP_LTZ', DataTypeExprKind.TIMESTAMPLTZ),\n TO_TIMESTAMP_NTZ: buildDatetime('TO_TIMESTAMP_NTZ', DataTypeExprKind.TIMESTAMPNTZ),\n TO_TIMESTAMP_TZ: buildDatetime('TO_TIMESTAMP_TZ', DataTypeExprKind.TIMESTAMPTZ),\n TO_VARCHAR: buildTimeToStrOrToChar,\n TO_JSON: (args: unknown[]) => JsonFormatExpr.fromArgList(args),\n VECTOR_COSINE_SIMILARITY: (args: unknown[]) => CosineDistanceExpr.fromArgList(args),\n VECTOR_INNER_PRODUCT: (args: unknown[]) => DotProductExpr.fromArgList(args),\n VECTOR_L1_DISTANCE: (args: unknown[]) => ManhattanDistanceExpr.fromArgList(args),\n VECTOR_L2_DISTANCE: (args: unknown[]) => EuclideanDistanceExpr.fromArgList(args),\n ZEROIFNULL: buildIfFromZeroifnull,\n LIKE: buildLike(LikeExpr),\n ILIKE: buildLike(ILikeExpr),\n SEARCH: buildSearch,\n SKEW: (args: unknown[]) => SkewnessExpr.fromArgList(args),\n SYSTIMESTAMP: (args: unknown[]) => CurrentTimestampExpr.fromArgList(args),\n WEEKISO: (args: unknown[]) => WeekOfYearExpr.fromArgList(args),\n WEEKOFYEAR: (args: unknown[]) => WeekExpr.fromArgList(args),\n };\n delete functions['PREDICT'];\n return functions;\n })();\n }\n\n @cache\n static get FUNCTION_PARSERS (): Partial<Record<string, (this: Parser) => Expression | undefined>> {\n return (() => {\n const parsers: Partial<Record<string, (this: Parser) => Expression | undefined>> = {\n ...Parser.FUNCTION_PARSERS,\n DATE_PART: function (this: Parser) {\n return (this as SnowflakeParser).parseDatePart();\n },\n DIRECTORY: function (this: Parser) {\n return (this as SnowflakeParser).parseDirectory();\n },\n OBJECT_CONSTRUCT_KEEP_NULL: function (this: Parser) {\n return (this as SnowflakeParser).parseJsonObject();\n },\n LISTAGG: function (this: Parser) {\n return this.parseStringAgg();\n },\n SEMANTIC_VIEW: function (this: Parser) {\n return (this as SnowflakeParser).parseSemanticView();\n },\n };\n delete parsers['TRIM'];\n return parsers;\n })();\n }\n\n @cache\n static get TIMESTAMPS (): Set<TokenType> {\n return new Set(\n Array.from(Parser.TIMESTAMPS).filter((t) => t !== TokenType.TIME),\n );\n }\n\n @cache\n static get ALTER_PARSERS (): Partial<Record<string, (this: Parser) => Expression | Expression[] | undefined>> {\n return {\n ...Parser.ALTER_PARSERS,\n SESSION: function (this: Parser) {\n return this.parseAlterSession();\n },\n UNSET: function (this: Parser) {\n return this.expression(SetExpr, {\n tag: this.matchTextSeq('TAG'),\n expressions: this.parseCsv(() => this.parseIdVar()),\n unset: true,\n });\n },\n };\n }\n\n @cache\n static get STATEMENT_PARSERS (): Partial<Record<TokenType, (this: Parser) => Expression | undefined>> {\n return {\n ...Parser.STATEMENT_PARSERS,\n [TokenType.GET]: function (this: Parser) {\n return (this as SnowflakeParser).parseGet();\n },\n [TokenType.PUT]: function (this: Parser) {\n return (this as SnowflakeParser).parsePut();\n },\n [TokenType.SHOW]: function (this: Parser) {\n return this.parseShow();\n },\n };\n }\n\n @cache\n static get PROPERTY_PARSERS (): Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined> {\n return {\n ...Parser.PROPERTY_PARSERS,\n CREDENTIALS: function (this: Parser) {\n return (this as SnowflakeParser).parseCredentialsProperty();\n },\n FILE_FORMAT: function (this: Parser) {\n return (this as SnowflakeParser).parseFileFormatProperty();\n },\n LOCATION: function (this: Parser) {\n return (this as SnowflakeParser).parseLocationProperty();\n },\n TAG: function (this: Parser) {\n return (this as SnowflakeParser).parseTag();\n },\n USING: function (this: Parser) {\n return (this.matchTextSeq('TEMPLATE') || undefined)\n && this.expression(UsingTemplatePropertyExpr, {\n this: this.parseStatement(),\n });\n },\n };\n }\n\n @cache\n static get TYPE_CONVERTERS () {\n return {\n [DataTypeExprKind.DECIMAL]: buildDefaultDecimalType(38, 0),\n };\n }\n\n @cache\n static get SHOW_PARSERS () {\n return {\n 'DATABASES': showParser('DATABASES'),\n 'TERSE DATABASES': showParser('DATABASES'),\n 'SCHEMAS': showParser('SCHEMAS'),\n 'TERSE SCHEMAS': showParser('SCHEMAS'),\n 'OBJECTS': showParser('OBJECTS'),\n 'TERSE OBJECTS': showParser('OBJECTS'),\n 'TABLES': showParser('TABLES'),\n 'TERSE TABLES': showParser('TABLES'),\n 'VIEWS': showParser('VIEWS'),\n 'TERSE VIEWS': showParser('VIEWS'),\n 'PRIMARY KEYS': showParser('PRIMARY KEYS'),\n 'TERSE PRIMARY KEYS': showParser('PRIMARY KEYS'),\n 'IMPORTED KEYS': showParser('IMPORTED KEYS'),\n 'TERSE IMPORTED KEYS': showParser('IMPORTED KEYS'),\n 'UNIQUE KEYS': showParser('UNIQUE KEYS'),\n 'TERSE UNIQUE KEYS': showParser('UNIQUE KEYS'),\n 'SEQUENCES': showParser('SEQUENCES'),\n 'TERSE SEQUENCES': showParser('SEQUENCES'),\n 'STAGES': showParser('STAGES'),\n 'COLUMNS': showParser('COLUMNS'),\n 'USERS': showParser('USERS'),\n 'TERSE USERS': showParser('USERS'),\n 'FILE FORMATS': showParser('FILE FORMATS'),\n 'FUNCTIONS': showParser('FUNCTIONS'),\n 'PROCEDURES': showParser('PROCEDURES'),\n 'WAREHOUSES': showParser('WAREHOUSES'),\n };\n }\n\n @cache\n static get CONSTRAINT_PARSERS (): Partial<Record<string, (this: Parser, ...args: unknown[]) => Expression | Expression[] | undefined>> {\n return {\n ...Parser.CONSTRAINT_PARSERS,\n WITH: function (this: Parser) {\n return (this as SnowflakeParser).parseWithConstraint();\n },\n MASKING: function (this: Parser) {\n return (this as SnowflakeParser).parseWithConstraint();\n },\n PROJECTION: function (this: Parser) {\n return (this as SnowflakeParser).parseWithConstraint();\n },\n TAG: function (this: Parser) {\n return (this as SnowflakeParser).parseWithConstraint();\n },\n };\n }\n\n @cache\n static get STAGED_FILE_SINGLE_TOKENS (): Set<TokenType> {\n return new Set([\n TokenType.DOT,\n TokenType.MOD,\n TokenType.SLASH,\n ]);\n }\n\n @cache\n static get FLATTEN_COLUMNS () {\n return [\n 'SEQ',\n 'KEY',\n 'PATH',\n 'INDEX',\n 'VALUE',\n 'THIS',\n ];\n }\n\n @cache\n static get SCHEMA_KINDS () {\n return new Set([\n 'OBJECTS',\n 'TABLES',\n 'VIEWS',\n 'SEQUENCES',\n 'UNIQUE KEYS',\n 'IMPORTED KEYS',\n ]);\n }\n\n @cache\n static get NON_TABLE_CREATABLES (): Set<string> {\n return new Set([\n 'STORAGE INTEGRATION',\n 'TAG',\n 'WAREHOUSE',\n 'STREAMLIT',\n ]);\n }\n\n @cache\n static get LAMBDAS (): Partial<Record<TokenType, (this: Parser, expressions: Expression[]) => Expression>> {\n return {\n ...Parser.LAMBDAS,\n [TokenType.ARROW]: function (this: Parser, expressions: Expression[]) {\n return this.expression(LambdaExpr, {\n this: this.replaceLambda(this.parseAssignment(), expressions),\n expressions: expressions.map((e) => (e instanceof CastExpr ? e.args.this : e)),\n });\n },\n };\n }\n\n @cache\n static get COLUMN_OPERATORS (): Partial<Record<TokenType, undefined | ((this: Parser, this_?: Expression, to?: Expression) => Expression)>> {\n return {\n ...Parser.COLUMN_OPERATORS,\n [TokenType.EXCLAMATION]: function (this: Parser, thisNode?: Expression, attr?: Expression) {\n return this.expression(ModelAttributeExpr, {\n this: thisNode,\n expression: attr,\n });\n },\n };\n }\n\n parseDirectory (): DirectoryStageExpr {\n let table: ExpressionOrString | undefined = this.parseTableParts();\n\n if (table instanceof TableExpr) {\n table = table.args.this;\n }\n\n return this.expression(DirectoryStageExpr, {\n this: table,\n });\n }\n\n parseUse (): UseExpr {\n if (this.matchTextSeq([\n 'SECONDARY',\n 'ROLES',\n ])) {\n const thisNode = this.matchTexts([\n 'ALL',\n 'NONE',\n ]) && new VarExpr({\n this: this.prev?.text.toUpperCase(),\n });\n const roles = thisNode\n ? undefined\n : this.parseCsv(() => this.parseTable({\n schema: false,\n }));\n return this.expression(UseExpr, {\n kind: 'SECONDARY ROLES',\n this: thisNode || undefined,\n expressions: roles,\n });\n }\n\n return super.parseUse();\n }\n\n negateRange (thisNode?: Expression): Expression | undefined {\n if (!thisNode) {\n return thisNode;\n }\n\n const query = thisNode.getArgKey('query');\n if (thisNode instanceof InExpr && query instanceof QueryExpr) {\n /**\n * Snowflake treats `value NOT IN (subquery)` as `VALUE <> ALL (subquery)`, so\n * we do this conversion here to avoid parsing it into `NOT value IN (subquery)`\n * which can produce different results.\n */\n return this.expression(NeqExpr, {\n this: thisNode.args.this,\n expression: new AllExpr({\n this: query.unnest(),\n }),\n });\n }\n\n return this.expression(NotExpr, {\n this: thisNode,\n });\n }\n\n parseTag (): TagsExpr {\n return this.expression(TagsExpr, {\n expressions: this.parseWrappedCsv(() => this.parseProperty() as Expression | undefined),\n });\n }\n\n parseWithConstraint (): Expression | undefined {\n if (this.prev?.tokenType !== TokenType.WITH) {\n this.retreat(this.index - 1);\n }\n\n if (this.matchTextSeq([\n 'MASKING',\n 'POLICY',\n ])) {\n const policy = this.parseColumn();\n return this.expression(MaskingPolicyColumnConstraintExpr, {\n this: policy instanceof ColumnExpr ? policy.toDot() : policy,\n expressions: this.match(TokenType.USING) && this.parseWrappedCsv(() => this.parseIdVar()),\n });\n }\n\n if (this.matchTextSeq([\n 'PROJECTION',\n 'POLICY',\n ])) {\n const policy = this.parseColumn();\n return this.expression(ProjectionPolicyColumnConstraintExpr, {\n this: policy instanceof ColumnExpr ? policy.toDot() : policy,\n });\n }\n\n if (this.match(TokenType.TAG)) {\n return this.parseTag();\n }\n\n return undefined;\n }\n\n parseWithProperty (): Expression | Expression[] | undefined {\n if (this.match(TokenType.TAG)) {\n return this.parseTag();\n }\n\n return super.parseWithProperty();\n }\n\n parseCreate (): CreateExpr | CommandExpr {\n const expression = super.parseCreate();\n if (\n expression instanceof CreateExpr\n && (this.constructor as typeof SnowflakeParser).NON_TABLE_CREATABLES.has(expression.args.kind ?? '')\n ) {\n // Replace the Table node with the enclosed Identifier\n const tableNode = expression.args.this;\n if (tableNode instanceof TableExpr) {\n tableNode.replace(tableNode.args.this);\n }\n }\n\n return expression;\n }\n\n parseDatePart (): Expression | undefined {\n const thisNode = this.parseVar() || this.parseType();\n\n if (!thisNode) {\n return undefined;\n }\n\n // Handle both syntaxes: DATE_PART(part, expr) and DATE_PART(part FROM expr)\n const expression = this.matchSet([\n TokenType.FROM,\n TokenType.COMMA,\n ]) && this.parseBitwise();\n\n return this.expression(ExtractExpr, {\n this: mapDatePart(thisNode, {\n dialect: this.dialect,\n }),\n expression: expression || undefined,\n });\n }\n\n parseBracketKeyValue (options: {isMap?: boolean} = {}): Expression | undefined {\n const {\n isMap = false,\n } = options;\n\n if (isMap) {\n return this.parseSlice(this.parseString()) || this.parseAssignment();\n }\n\n return this.parseSlice(this.parseAlias(this.parseAssignment(), {\n explicit: true,\n }));\n }\n\n parseLateral (): LateralExpr | undefined {\n const lateral = super.parseLateral();\n if (!lateral) {\n return lateral;\n }\n\n if (lateral.args.this instanceof ExplodeExpr) {\n const tableAlias = lateral.args.alias;\n const columns = (this.constructor as typeof SnowflakeParser).FLATTEN_COLUMNS.map((col) =>\n toIdentifier(col));\n\n if (tableAlias && !tableAlias.getArgKey('columns')) {\n tableAlias.setArgKey('columns', columns);\n } else if (!tableAlias) {\n alias(lateral, '_flattened', {\n table: columns,\n copy: false,\n });\n }\n }\n\n return lateral;\n }\n\n parseTableParts (options: {schema?: boolean;\n isDbReference?: boolean;\n wildcard?: boolean;} = {}): TableExpr {\n const {\n schema = false, isDbReference = false,\n } = options;\n\n let table: Expression | undefined;\n\n if (this.match(TokenType.STRING, {\n advance: false,\n })) {\n table = this.parseString();\n } else if (this.matchTextSeq('@', {\n advance: false,\n })) {\n table = this.parseLocationPath();\n }\n\n if (table) {\n let fileFormat: Expression | undefined;\n let pattern: Expression | undefined;\n\n const wrapped = this.match(TokenType.L_PAREN);\n while (this.curr && wrapped && !this.match(TokenType.R_PAREN)) {\n if (this.matchTextSeq([\n 'FILE_FORMAT',\n '=>',\n ])) {\n fileFormat = this.parseString() || super.parseTableParts({\n isDbReference,\n });\n } else if (this.matchTextSeq([\n 'PATTERN',\n '=>',\n ])) {\n pattern = this.parseString();\n } else {\n break;\n }\n\n this.match(TokenType.COMMA);\n }\n\n return this.expression(TableExpr, {\n this: table,\n format: fileFormat,\n pattern,\n });\n }\n\n return super.parseTableParts({\n schema,\n isDbReference,\n });\n }\n\n parseTable (options: {\n schema?: boolean;\n joins?: boolean;\n aliasTokens?: Set<TokenType>;\n parseBracket?: boolean;\n isDbReference?: boolean;\n parsePartition?: boolean;\n consumePipe?: boolean;\n } = {}): Expression | undefined {\n let table = super.parseTable(options);\n\n if (table instanceof TableExpr && table.args.this instanceof TableFromRowsExpr) {\n const tableFromRows = table.args.this;\n for (const arg of TableFromRowsExpr.availableArgs) {\n if (arg !== 'this') {\n tableFromRows.setArgKey(arg, table.getArgKey(arg));\n }\n }\n\n table = tableFromRows;\n }\n\n return table;\n }\n\n parseIdVar (options: {anyToken?: boolean;\n tokens?: Set<TokenType>;} = {}): Expression | undefined {\n const {\n anyToken = true, tokens,\n } = options;\n\n if (this.matchTextSeq([\n 'IDENTIFIER',\n '(',\n ])) {\n const identifier = super.parseIdVar({\n anyToken,\n tokens,\n }) || this.parseString();\n this.matchRParen();\n return this.expression(AnonymousExpr, {\n this: 'IDENTIFIER',\n expressions: [\n identifier,\n ],\n });\n }\n\n return super.parseIdVar({\n anyToken,\n tokens,\n });\n }\n\n parseShowSnowflake (thisNode: string): ShowExpr {\n let scope: Expression | undefined;\n let scopeKind: string | undefined;\n\n // will identify SHOW TERSE SCHEMAS but not SHOW TERSE PRIMARY KEYS\n // which is syntactically valid but has no effect on the output\n const terse = this.tokens[this.index - 2].text.toUpperCase() === 'TERSE';\n\n const history = this.matchTextSeq('HISTORY');\n\n const like = this.match(TokenType.LIKE) ? this.parseString() : undefined;\n\n if (this.match(TokenType.IN)) {\n if (this.matchTextSeq('ACCOUNT')) {\n scopeKind = 'ACCOUNT';\n } else if (this.matchTextSeq('CLASS')) {\n scopeKind = 'CLASS';\n scope = this.parseTableParts();\n } else if (this.matchTextSeq('APPLICATION')) {\n scopeKind = 'APPLICATION';\n if (this.matchTextSeq('PACKAGE')) {\n scopeKind += ' PACKAGE';\n }\n scope = this.parseTableParts();\n } else if (this.matchSet((this.constructor as typeof SnowflakeParser).DB_CREATABLES)) {\n scopeKind = this.prev?.text.toUpperCase();\n if (this.curr) {\n scope = this.parseTableParts();\n }\n } else if (this.curr) {\n scopeKind = (this.constructor as typeof SnowflakeParser).SCHEMA_KINDS.has(thisNode) ? 'SCHEMA' : 'TABLE';\n scope = this.parseTableParts();\n }\n }\n\n return this.expression(ShowExpr, {\n terse,\n this: thisNode,\n history,\n like,\n scope,\n scopeKind,\n startsWith: this.matchTextSeq([\n 'STARTS',\n 'WITH',\n ])\n ? this.parseString()\n : undefined,\n limit: this.parseLimit(),\n from: this.match(TokenType.FROM) ? this.parseString() : undefined,\n privileges: this.matchTextSeq([\n 'WITH',\n 'PRIVILEGES',\n ])\n ? this.parseCsv(() => this.parseVar({\n anyToken: true,\n upper: true,\n }))\n : undefined,\n });\n }\n\n parsePut (): PutExpr | CommandExpr {\n if (this.curr?.tokenType !== TokenType.STRING) {\n return this.parseAsCommand(this.prev);\n }\n\n return this.expression(PutExpr, {\n this: this.parseString(),\n target: this.parseLocationPath(),\n properties: this.parseProperties(),\n });\n }\n\n parseGet (): Expression | undefined {\n const start = this.prev;\n\n // If we detect GET( then we need to parse a function, not a statement\n if (this.match(TokenType.L_PAREN)) {\n this.retreat(this.index - 2);\n return this.parseExpression();\n }\n\n const target = this.parseLocationPath();\n\n // Parse as command if unquoted file path\n if (this.curr?.tokenType === TokenType.URI_START) {\n return this.parseAsCommand(start);\n }\n\n return this.expression(GetExpr, {\n this: this.parseString(),\n target,\n properties: this.parseProperties(),\n });\n }\n\n parseLocationProperty (): LocationPropertyExpr {\n this.match(TokenType.EQ);\n return this.expression(LocationPropertyExpr, {\n this: this.parseLocationPath(),\n });\n }\n\n parseFileLocation (): Expression | undefined {\n // Parse either a subquery or a staged file\n return this.match(TokenType.L_PAREN, {\n advance: false,\n })\n ? this.parseSelect({\n table: true,\n parseSubqueryAlias: false,\n })\n : this.parseTableParts();\n }\n\n parseLocationPath (): VarExpr {\n const start = this.curr;\n this.advanceAny({\n ignoreReserved: true,\n });\n\n // We avoid consuming a comma token because external tables like @foo and @bar\n // can be joined in a query with a comma separator, as well as closing paren\n // in case of subqueries\n while (\n this.isConnected()\n && !this.matchSet([\n TokenType.COMMA,\n TokenType.L_PAREN,\n TokenType.R_PAREN,\n ], {\n advance: false,\n })\n ) {\n this.advanceAny({\n ignoreReserved: true,\n });\n }\n\n return new VarExpr({\n this: this.findSql(start, this.prev),\n });\n }\n\n parseLambdaArg (): Expression | undefined {\n const thisNode = super.parseLambdaArg();\n\n if (!thisNode) {\n return thisNode;\n }\n\n const typ = this.parseTypes();\n\n if (typ) {\n return this.expression(CastExpr, {\n this: thisNode,\n to: typ,\n });\n }\n\n return thisNode;\n }\n\n parseForeignKey (): ForeignKeyExpr {\n // inlineFK, the REFERENCES columns are implied\n if (this.match(TokenType.REFERENCES, {\n advance: false,\n })) {\n return this.expression(ForeignKeyExpr);\n }\n\n // outoflineFK, explicitly names the columns\n return super.parseForeignKey();\n }\n\n parseFileFormatProperty (): FileFormatPropertyExpr {\n this.match(TokenType.EQ);\n let expressions: Expression[];\n\n if (this.match(TokenType.L_PAREN, {\n advance: false,\n })) {\n expressions = this.parseWrappedOptions();\n } else {\n expressions = [\n this.parseFormatName(),\n ];\n }\n\n return this.expression(FileFormatPropertyExpr, {\n expressions,\n });\n }\n\n parseCredentialsProperty (): CredentialsPropertyExpr {\n return this.expression(CredentialsPropertyExpr, {\n expressions: this.parseWrappedOptions(),\n });\n }\n\n parseSemanticView (): SemanticViewExpr {\n const kwargs: Record<string, unknown> = {\n this: this.parseTableParts(),\n };\n\n while (this.curr && !this.match(TokenType.R_PAREN, {\n advance: false,\n })) {\n if (this.matchTexts([\n 'DIMENSIONS',\n 'METRICS',\n 'FACTS',\n ])) {\n const keyword = this.prev?.text.toLowerCase() ?? '';\n kwargs[keyword] = this.parseCsv(() => this.parseDisjunction());\n } else if (this.matchTextSeq('WHERE')) {\n kwargs['where'] = this.parseExpression();\n } else {\n this.raiseError('Expecting ) or encountered unexpected keyword');\n break;\n }\n }\n\n return this.expression(SemanticViewExpr, kwargs);\n }\n\n parseSet (options: {\n unset?: boolean;\n tag?: boolean;\n } = {}): SetExpr | CommandExpr {\n const {\n unset = false, tag = false,\n } = options;\n const setNode = super.parseSet({\n unset,\n tag,\n });\n\n if (setNode instanceof SetExpr) {\n for (const expr of setNode.args.expressions || [\n ]) {\n if (expr instanceof SetItemExpr) {\n expr.setArgKey('kind', 'VARIABLE');\n }\n }\n }\n return setNode;\n }\n\n parseWindow (thisNode?: Expression, options: {alias?: boolean} = {}): Expression | undefined {\n if (thisNode instanceof NthValueExpr) {\n if (this.matchTextSeq('FROM')) {\n if (this.matchTexts([\n 'FIRST',\n 'LAST',\n ])) {\n const fromFirst = this.prev?.text.toUpperCase() === 'FIRST';\n thisNode.setArgKey('fromFirst', fromFirst);\n }\n }\n }\n\n return super.parseWindow(thisNode, options);\n }\n}\n\nclass SnowflakeGenerator extends Generator {\n // port from _Dialect metaclass logic\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n // port from _Dialect metaclass logic\n static readonly SELECT_KINDS: string[] = [\n ];\n // port from _Dialect metaclass logic\n static TRY_SUPPORTED = false;\n // port from _Dialect metaclass logic\n static SUPPORTS_UESCAPE = false;\n static PARAMETER_TOKEN = '$';\n static MATCHED_BY_SOURCE = false;\n static SINGLE_STRING_INTERVAL = true;\n static JOIN_HINTS = false;\n static TABLE_HINTS = false;\n static QUERY_HINTS = false;\n static AGGREGATE_FILTER_SUPPORTED = false;\n static SUPPORTS_TABLE_COPY = false;\n static COLLATE_IS_FUNC = true;\n static LIMIT_ONLY_LITERALS = true;\n static JSON_KEY_VALUE_PAIR_SEP = ',';\n static INSERT_OVERWRITE = ' OVERWRITE INTO';\n @cache\n static get STRUCT_DELIMITER () {\n return [\n '(',\n ')',\n ];\n }\n\n static COPY_PARAMS_ARE_WRAPPED = false;\n static COPY_PARAMS_EQ_REQUIRED = true;\n static STAR_EXCEPT = 'EXCLUDE';\n static SUPPORTS_EXPLODING_PROJECTIONS = false;\n static ARRAY_CONCAT_IS_VAR_LEN = false;\n static SUPPORTS_CONVERT_TIMEZONE = true;\n static EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE = false;\n static SUPPORTS_MEDIAN = true;\n static ARRAY_SIZE_NAME = 'ARRAY_SIZE';\n static SUPPORTS_DECODE_CASE = true;\n static IS_BOOL_ALLOWED = false;\n static DIRECTED_JOINS = true;\n\n @cache\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static get ORIGINAL_TRANSFORMS (): Map<typeof Expression, (this: Generator, e: any) => string> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transforms = new Map<typeof Expression, (this: Generator, e: any) => string>([\n ...Generator.TRANSFORMS,\n [\n ApproxDistinctExpr,\n renameFunc('APPROX_COUNT_DISTINCT'),\n ],\n [\n ArgMaxExpr,\n renameFunc('MAX_BY'),\n ],\n [\n ArgMinExpr,\n renameFunc('MIN_BY'),\n ],\n [\n ArrayExpr,\n preprocess([\n inheritStructFieldNames,\n ]),\n ],\n [\n ArrayConcatExpr,\n arrayConcatSql('ARRAY_CAT'),\n ],\n [\n ArrayAppendExpr,\n arrayAppendSql('ARRAY_APPEND'),\n ],\n [\n ArrayPrependExpr,\n arrayAppendSql('ARRAY_PREPEND'),\n ],\n [\n ArrayContainsExpr,\n function (this: Generator, e: ArrayContainsExpr) {\n return this.func('ARRAY_CONTAINS', [\n e.args.ensureVariant === false\n ? e.args.expression\n : new CastExpr({\n this: e.args.expression,\n to: DataTypeExpr.build(DataTypeExprKind.VARIANT),\n }),\n e.args.this,\n ]);\n },\n ],\n [\n ArrayIntersectExpr,\n renameFunc('ARRAY_INTERSECTION'),\n ],\n [\n AtTimeZoneExpr,\n function (this: Generator, e: AtTimeZoneExpr) {\n return this.func('CONVERT_TIMEZONE', [\n e.args.zone,\n e.args.this,\n ]);\n },\n ],\n [\n BitwiseOrExpr,\n renameFunc('BITOR'),\n ],\n [\n BitwiseXorExpr,\n renameFunc('BITXOR'),\n ],\n [\n BitwiseAndExpr,\n renameFunc('BITAND'),\n ],\n [\n BitwiseAndAggExpr,\n renameFunc('BITANDAGG'),\n ],\n [\n BitwiseOrAggExpr,\n renameFunc('BITORAGG'),\n ],\n [\n BitwiseXorAggExpr,\n renameFunc('BITXORAGG'),\n ],\n [\n BitwiseNotExpr,\n renameFunc('BITNOT'),\n ],\n [\n BitwiseLeftShiftExpr,\n renameFunc('BITSHIFTLEFT'),\n ],\n [\n BitwiseRightShiftExpr,\n renameFunc('BITSHIFTRIGHT'),\n ],\n [\n CreateExpr,\n preprocess([\n flattenStructuredTypesUnlessIceberg,\n ]),\n ],\n [\n CurrentTimestampExpr,\n function (this: Generator, e: CurrentTimestampExpr) {\n return e.args.sysdate\n ? this.func('SYSDATE', [\n ])\n : this.functionFallbackSql(e);\n },\n ],\n [\n LocaltimeExpr,\n function (this: Generator, e: LocaltimeExpr) {\n return e.args.this\n ? this.func('CURRENT_TIME', [\n e.args.this,\n ])\n : 'CURRENT_TIME';\n },\n ],\n [\n LocaltimestampExpr,\n function (this: Generator, e: LocaltimestampExpr) {\n return e.args.this\n ? this.func('CURRENT_TIMESTAMP', [\n e.args.this,\n ])\n : 'CURRENT_TIMESTAMP';\n },\n ],\n [\n DateAddExpr,\n dateDeltaSql('DATEADD'),\n ],\n [\n DateDiffExpr,\n dateDeltaSql('DATEDIFF'),\n ],\n [\n DatetimeAddExpr,\n dateDeltaSql('TIMESTAMPADD'),\n ],\n [\n DatetimeDiffExpr,\n timestampDiffSql,\n ],\n [\n DateStrToDateExpr,\n dateStrToDateSql,\n ],\n [\n DecryptExpr,\n function (this: Generator, e: DecryptExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}DECRYPT`, [\n e.args.this,\n e.args.passphrase,\n e.args.aad,\n e.args.encryptionMethod,\n ]);\n },\n ],\n [\n DecryptRawExpr,\n function (this: Generator, e: DecryptRawExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}DECRYPT_RAW`, [\n e.args.this,\n e.args.key,\n e.args.iv,\n e.args.aad,\n e.args.encryptionMethod,\n e.args.aead as Expression | undefined,\n ]);\n },\n ],\n [\n DayOfMonthExpr,\n renameFunc('DAYOFMONTH'),\n ],\n [\n DayOfWeekExpr,\n renameFunc('DAYOFWEEK'),\n ],\n [\n DayOfWeekIsoExpr,\n renameFunc('DAYOFWEEKISO'),\n ],\n [\n DayOfYearExpr,\n renameFunc('DAYOFYEAR'),\n ],\n [\n DotProductExpr,\n renameFunc('VECTOR_INNER_PRODUCT'),\n ],\n [\n ExplodeExpr,\n renameFunc('FLATTEN'),\n ],\n [\n ExtractExpr,\n function (this: Generator, e: ExtractExpr) {\n return this.func('DATE_PART', [\n mapDatePart(e.args.this, {\n dialect: this.dialect,\n }),\n e.args.expression,\n ]);\n },\n ],\n [\n CosineDistanceExpr,\n renameFunc('VECTOR_COSINE_SIMILARITY'),\n ],\n [\n EuclideanDistanceExpr,\n renameFunc('VECTOR_L2_DISTANCE'),\n ],\n [\n FileFormatPropertyExpr,\n function (this: Generator, e: FileFormatPropertyExpr) {\n return `FILE_FORMAT=(${this.expressions(e, {\n key: 'expressions',\n sep: ' ',\n })})`;\n },\n ],\n [\n FromTimeZoneExpr,\n function (this: Generator, e: FromTimeZoneExpr) {\n return this.func('CONVERT_TIMEZONE', [\n e.args.zone,\n LiteralExpr.string('UTC'),\n e.args.this,\n ]);\n },\n ],\n [\n GenerateSeriesExpr,\n function (this: Generator, e: GenerateSeriesExpr) {\n return this.func('ARRAY_GENERATE_RANGE', [\n e.args.start,\n e.args.end?.add(1),\n e.args.step,\n ]);\n },\n ],\n [\n GetExtractExpr,\n renameFunc('GET'),\n ],\n [\n GroupConcatExpr,\n function (this: Generator, e: GroupConcatExpr) {\n return groupConcatSql.call(this, e, {\n sep: '',\n });\n },\n ],\n [\n IfExpr,\n ifSql('IFF', 'NULL'),\n ],\n [\n JsonExtractArrayExpr,\n jsonExtractValueArraySql,\n ],\n [\n JsonExtractScalarExpr,\n function (this: Generator, e: JsonExtractScalarExpr) {\n return this.func('JSON_EXTRACT_PATH_TEXT', [\n e.args.this,\n e.args.expression,\n ]);\n },\n ],\n [\n JsonKeysExpr,\n renameFunc('OBJECT_KEYS'),\n ],\n [\n JsonObjectExpr,\n function (this: Generator, e: JsonObjectExpr) {\n return this.func('OBJECT_CONSTRUCT_KEEP_NULL', e.args.expressions || [\n ]);\n },\n ],\n [\n JsonPathRootExpr,\n () => '',\n ],\n [\n JsonValueArrayExpr,\n jsonExtractValueArraySql,\n ],\n [\n LevenshteinExpr,\n function (this: Generator, e: LevenshteinExpr) {\n unsupportedArgs.call(this, e, 'insCost', 'delCost', 'subCost');\n return renameFunc('EDITDISTANCE').call(this, e);\n },\n ],\n [\n LocationPropertyExpr,\n function (this: Generator, e: LocationPropertyExpr) {\n return `LOCATION=${this.sql(e, 'this')}`;\n },\n ],\n [\n LogicalAndExpr,\n renameFunc('BOOLAND_AGG'),\n ],\n [\n LogicalOrExpr,\n renameFunc('BOOLOR_AGG'),\n ],\n [\n MapExpr,\n function (this: Generator, e: MapExpr) {\n return varMapSql.call(this, e, 'OBJECT_CONSTRUCT');\n },\n ],\n [\n ManhattanDistanceExpr,\n renameFunc('VECTOR_L1_DISTANCE'),\n ],\n [\n MakeIntervalExpr,\n noMakeIntervalSql,\n ],\n [\n MaxExpr,\n maxOrGreatest,\n ],\n [\n MinExpr,\n minOrLeast,\n ],\n [\n ParseJsonExpr,\n function (this: Generator, e: ParseJsonExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}PARSE_JSON`, [\n e.args.this,\n ]);\n },\n ],\n [\n ToBinaryExpr,\n function (this: Generator, e: ToBinaryExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_BINARY`, [\n e.args.this,\n e.args.format,\n ]);\n },\n ],\n [\n ToBooleanExpr,\n function (this: Generator, e: ToBooleanExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_BOOLEAN`, [\n e.args.this,\n ]);\n },\n ],\n [\n ToDoubleExpr,\n function (this: Generator, e: ToDoubleExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_DOUBLE`, [\n e.args.this,\n e.args.format,\n ]);\n },\n ],\n [\n ToFileExpr,\n function (this: Generator, e: ToFileExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_FILE`, [\n e.args.this,\n e.args.path,\n ]);\n },\n ],\n [\n ToNumberExpr,\n function (this: Generator, e: ToNumberExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_NUMBER`, [\n e.args.this,\n e.args.format,\n e.args.precision,\n e.args.scale,\n ]);\n },\n ],\n [\n JsonFormatExpr,\n renameFunc('TO_JSON'),\n ],\n [\n PartitionedByPropertyExpr,\n function (this: Generator, e: PartitionedByPropertyExpr) {\n return `PARTITION BY ${this.sql(e, 'this')}`;\n },\n ],\n [\n PercentileContExpr,\n preprocess([\n addWithinGroupForPercentiles,\n ]),\n ],\n [\n PercentileDiscExpr,\n preprocess([\n addWithinGroupForPercentiles,\n ]),\n ],\n [\n PivotExpr,\n preprocess([\n unqualifyPivotColumns,\n ]),\n ],\n [\n RegexpExtractExpr,\n regexpExtractSql,\n ],\n [\n RegexpExtractAllExpr,\n regexpExtractSql,\n ],\n [\n RegexpILikeExpr,\n regexpILikeSql,\n ],\n [\n RandExpr,\n renameFunc('RANDOM'),\n ],\n [\n SelectExpr,\n preprocess([\n eliminateWindowClause,\n eliminateDistinctOn,\n explodeProjectionToUnnest(),\n eliminateSemiAndAntiJoins,\n transformGenerateDateArray,\n qualifyUnnestedColumns,\n eliminateDotVariantLookup,\n ]),\n ],\n [\n ShaExpr,\n renameFunc('SHA1'),\n ],\n [\n Sha1DigestExpr,\n renameFunc('SHA1_BINARY'),\n ],\n [\n Md5DigestExpr,\n renameFunc('MD5_BINARY'),\n ],\n [\n Md5NumberLower64Expr,\n renameFunc('MD5_NUMBER_LOWER64'),\n ],\n [\n Md5NumberUpper64Expr,\n renameFunc('MD5_NUMBER_UPPER64'),\n ],\n [\n LowerHexExpr,\n renameFunc('TO_CHAR'),\n ],\n [\n SortArrayExpr,\n renameFunc('ARRAY_SORT'),\n ],\n [\n SkewnessExpr,\n renameFunc('SKEW'),\n ],\n [\n StarMapExpr,\n renameFunc('OBJECT_CONSTRUCT'),\n ],\n [\n StartsWithExpr,\n renameFunc('STARTSWITH'),\n ],\n [\n EndsWithExpr,\n renameFunc('ENDSWITH'),\n ],\n [\n StrPositionExpr,\n function (this: Generator, e: StrPositionExpr) {\n return strPositionSql.call(this, e, {\n funcName: 'CHARINDEX',\n supportsPosition: true,\n });\n },\n ],\n [\n StrToDateExpr,\n function (this: Generator, e: StrToDateExpr) {\n return this.func('DATE', [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n StringToArrayExpr,\n renameFunc('STRTOK_TO_ARRAY'),\n ],\n [\n StuffExpr,\n renameFunc('INSERT'),\n ],\n [\n StPointExpr,\n renameFunc('ST_MAKEPOINT'),\n ],\n [\n TimeAddExpr,\n dateDeltaSql('TIMEADD'),\n ],\n [\n TimeSliceExpr,\n function (this: Generator, e: TimeSliceExpr) {\n return this.func('TIME_SLICE', [\n e.args.this,\n e.args.expression,\n unitToStr(e),\n e.args.kind,\n ]);\n },\n ],\n [\n TimestampExpr,\n noTimestampSql,\n ],\n [\n TimestampAddExpr,\n dateDeltaSql('TIMESTAMPADD'),\n ],\n [\n TimestampDiffExpr,\n function (this: Generator, e: TimestampDiffExpr) {\n return this.func('TIMESTAMPDIFF', [\n e.args.unit,\n e.args.expression,\n e.args.this,\n ]);\n },\n ],\n [\n TimestampTruncExpr,\n timestampTruncSql(),\n ],\n [\n TimeStrToTimeExpr,\n timeStrToTimeSql,\n ],\n [\n TimeToUnixExpr,\n function (this: Generator, e: TimeToUnixExpr) {\n return `EXTRACT(epoch_second FROM ${this.sql(e, 'this')})`;\n },\n ],\n [\n ToArrayExpr,\n renameFunc('TO_ARRAY'),\n ],\n [\n ToCharExpr,\n function (this: Generator, e: ToCharExpr) {\n return this.functionFallbackSql(e);\n },\n ],\n [\n TsOrDsAddExpr,\n dateDeltaSql('DATEADD', {\n cast: true,\n }),\n ],\n [\n TsOrDsDiffExpr,\n dateDeltaSql('DATEDIFF'),\n ],\n [\n TsOrDsToDateExpr,\n function (this: Generator, e: TsOrDsToDateExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_DATE`, [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n TsOrDsToTimeExpr,\n function (this: Generator, e: TsOrDsToTimeExpr) {\n return this.func(`${e.args.safe ? 'TRY_' : ''}TO_TIME`, [\n e.args.this,\n this.formatTime(e),\n ]);\n },\n ],\n [\n UnhexExpr,\n renameFunc('HEX_DECODE_BINARY'),\n ],\n [\n UnixToTimeExpr,\n function (this: Generator, e: UnixToTimeExpr) {\n return this.func('TO_TIMESTAMP', [\n e.args.this,\n e.args.scale,\n ]);\n },\n ],\n [\n UuidExpr,\n renameFunc('UUID_STRING'),\n ],\n [\n VarMapExpr,\n function (this: Generator, e: VarMapExpr) {\n return varMapSql.call(this, e, 'OBJECT_CONSTRUCT');\n },\n ],\n [\n BoolandExpr,\n renameFunc('BOOLAND'),\n ],\n [\n BoolorExpr,\n renameFunc('BOOLOR'),\n ],\n [\n WeekOfYearExpr,\n renameFunc('WEEKISO'),\n ],\n [\n YearOfWeekExpr,\n renameFunc('YEAROFWEEK'),\n ],\n [\n YearOfWeekIsoExpr,\n renameFunc('YEAROFWEEKISO'),\n ],\n [\n XorExpr,\n renameFunc('BOOLXOR'),\n ],\n [\n ByteLengthExpr,\n renameFunc('OCTET_LENGTH'),\n ],\n [\n FlattenExpr,\n renameFunc('ARRAY_FLATTEN'),\n ],\n [\n ArrayConcatAggExpr,\n function (this: Generator, e: ArrayConcatAggExpr) {\n return this.func('ARRAY_FLATTEN', [\n new ArrayAggExpr({\n this: e.args.this,\n }),\n ]);\n },\n ],\n [\n Sha2DigestExpr,\n function (this: Generator, e: Sha2DigestExpr) {\n return this.func('SHA2_BINARY', [\n e.args.this,\n e.args.length || LiteralExpr.number(256),\n ]);\n },\n ],\n ]);\n return transforms;\n }\n\n nthValueSql (expression: NthValueExpr): string {\n let result = this.func('NTH_VALUE', [\n expression.args.this,\n expression.args.offset,\n ]);\n const fromFirst = expression.args.fromFirst;\n\n if (fromFirst !== undefined) {\n result += fromFirst ? ' FROM FIRST' : ' FROM LAST';\n }\n\n return result;\n }\n\n @cache\n static get SUPPORTED_JSON_PATH_PARTS (): Set<typeof Expression> {\n return new Set([\n JsonPathKeyExpr,\n JsonPathRootExpr,\n JsonPathSubscriptExpr,\n ]);\n }\n\n @cache\n static get TYPE_MAPPING () {\n return new Map([\n ...Generator.TYPE_MAPPING,\n [\n DataTypeExprKind.BIGDECIMAL,\n 'DOUBLE',\n ],\n [\n DataTypeExprKind.NESTED,\n 'OBJECT',\n ],\n [\n DataTypeExprKind.STRUCT,\n 'OBJECT',\n ],\n [\n DataTypeExprKind.TEXT,\n 'VARCHAR',\n ],\n ]);\n }\n\n @cache\n static get TOKEN_MAPPING (): Partial<Record<TokenType, string>> {\n return {\n [TokenType.AUTO_INCREMENT]: 'AUTOINCREMENT',\n };\n }\n\n @cache\n static get PROPERTIES_LOCATION () {\n return new Map([\n ...Generator.PROPERTIES_LOCATION,\n [\n CredentialsPropertyExpr,\n PropertiesLocation.POST_WITH,\n ],\n [\n LocationPropertyExpr,\n PropertiesLocation.POST_WITH,\n ],\n [\n PartitionedByPropertyExpr,\n PropertiesLocation.POST_SCHEMA,\n ],\n [\n SetPropertyExpr,\n PropertiesLocation.UNSUPPORTED,\n ],\n [\n VolatilePropertyExpr,\n PropertiesLocation.UNSUPPORTED,\n ],\n ]);\n }\n\n @cache\n static get UNSUPPORTED_VALUES_EXPRESSIONS (): Set<typeof Expression> {\n return new Set([\n MapExpr,\n StarMapExpr,\n StructExpr,\n VarMapExpr,\n ]);\n }\n\n @cache\n static get RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS (): (typeof Expression)[] {\n return [\n ArrayAggExpr,\n ];\n }\n\n withProperties (properties: PropertiesExpr): string {\n return this.properties(properties, {\n wrapped: false,\n prefix: this.sep(''),\n sep: ' ',\n });\n }\n\n valuesSql (expression: ValuesExpr, options: {valuesAsTable?: boolean} = {}): string {\n let {\n valuesAsTable = true,\n } = options;\n if (expression.find((this._constructor as typeof SnowflakeGenerator).UNSUPPORTED_VALUES_EXPRESSIONS)) {\n valuesAsTable = false;\n }\n\n return super.valuesSql(expression, {\n valuesAsTable,\n });\n }\n\n dataTypeSql (expression: DataTypeExpr): string {\n // Check if this is a FLOAT type nested inside a VECTOR type\n // VECTOR only accepts FLOAT (not DOUBLE), INT, and STRING as element types\n if (expression.isType(DataTypeExprKind.DOUBLE)) {\n const parent = expression.parent;\n if (parent instanceof DataTypeExpr && parent.isType(DataTypeExprKind.VECTOR)) {\n return 'FLOAT';\n }\n }\n\n const expressions = expression.args.expressions;\n if (expressions && expression.isType(DataTypeExpr.STRUCT_TYPES)) {\n for (const fieldType of expressions) {\n // The correct syntax is OBJECT [ (<key> <value_type [NOT NULL] [, ...]) ]\n if (fieldType instanceof DataTypeExpr) {\n return 'OBJECT';\n }\n if (fieldType instanceof ColumnDefExpr && fieldType.args.this instanceof LiteralExpr && fieldType.args.this.isString) {\n fieldType.args.this.replace(toIdentifier(fieldType.name, {\n quoted: true,\n }));\n }\n }\n }\n\n return super.dataTypeSql(expression);\n }\n\n toNumberSql (expression: ToNumberExpr): string {\n return this.func('TO_NUMBER', [\n expression.args.this,\n expression.args.format,\n expression.args.precision,\n expression.args.scale,\n ]);\n }\n\n timestampFromPartsSql (expression: TimestampFromPartsExpr): string {\n const milli = expression.args.milli;\n if (milli !== undefined) {\n const milliToNano = milli.pop().mul(LiteralExpr.number(1000000));\n expression.setArgKey('nano', milliToNano);\n }\n\n return renameFunc('TIMESTAMP_FROM_PARTS').call(this, expression);\n }\n\n castSql (expression: CastExpr, options: {safePrefix?: string} = {}): string {\n if (expression.isType(DataTypeExprKind.GEOGRAPHY)) {\n return this.func('TO_GEOGRAPHY', [\n expression.args.this,\n ]);\n }\n if (expression.isType(DataTypeExprKind.GEOMETRY)) {\n return this.func('TO_GEOMETRY', [\n expression.args.this,\n ]);\n }\n\n return super.castSql(expression, options);\n }\n\n tryCastSql (expression: TryCastExpr): string {\n let value = expression.args.this;\n\n if (value !== undefined && !value.type) {\n value = annotateTypes(value, {\n dialect: this.dialect,\n });\n }\n\n // Snowflake requires that TRY_CAST's value be a string\n if (expression.args.requiresString || value?.isType(DataTypeExpr.TEXT_TYPES)) {\n return super.tryCastSql(expression);\n }\n\n return this.castSql(expression as CastExpr);\n }\n\n logSql (expression: LogExpr): string {\n if (!expression.args.expression) {\n return this.func('LN', [\n expression.args.this,\n ]);\n }\n\n return super.logSql(expression);\n }\n\n greatestSql (expression: GreatestExpr): string {\n const name = expression.args.ignoreNulls ? 'GREATEST_IGNORE_NULLS' : 'GREATEST';\n return this.func(name, [\n expression.args.this,\n ...(expression.args.expressions || [\n ]),\n ]);\n }\n\n leastSql (expression: LeastExpr): string {\n const name = expression.args.ignoreNulls ? 'LEAST_IGNORE_NULLS' : 'LEAST';\n return this.func(name, [\n expression.args.this,\n ...(expression.args.expressions || [\n ]),\n ]);\n }\n\n generatorSql (expression: GeneratorExpr): string {\n const args: Expression[] = [\n ];\n const rowcount = expression.args.rowcount;\n const timeLimit = expression.args.timeLimit;\n\n if (rowcount) {\n args.push(new KwargExpr({\n this: new VarExpr({\n this: 'ROWCOUNT',\n }),\n expression: rowcount,\n }));\n }\n if (timeLimit) {\n args.push(new KwargExpr({\n this: new VarExpr({\n this: 'TIMELIMIT',\n }),\n expression: timeLimit,\n }));\n }\n\n return this.func('GENERATOR', args);\n }\n\n unnestSql (expression: UnnestExpr): string {\n const unnestAlias = expression.args.alias;\n const offset = expression.args.offset;\n\n const unnestAliasColumns = narrowInstanceOf(unnestAlias, TableAliasExpr)?.args.columns || [\n ];\n const value = seqGet(unnestAliasColumns, 0) || toIdentifier('value');\n\n const columns = [\n toIdentifier('seq'),\n toIdentifier('key'),\n toIdentifier('path'),\n offset instanceof IdentifierExpr ? offset.pop() : toIdentifier('index'),\n value,\n toIdentifier('this'),\n ];\n\n let finalAlias = unnestAlias;\n if (finalAlias) {\n finalAlias.setArgKey('columns', columns);\n } else {\n finalAlias = new TableAliasExpr({\n this: toIdentifier('_u'),\n columns,\n });\n }\n\n let tableInput = this.sql(expression.args.expressions?.[0]);\n if (!tableInput.startsWith('INPUT =>')) {\n tableInput = `INPUT => ${tableInput}`;\n }\n\n const expressionParent = expression.parent;\n\n const explode = (expressionParent instanceof LateralExpr)\n ? `FLATTEN(${tableInput})`\n : `TABLE(FLATTEN(${tableInput}))`;\n\n const aliasSql = this.sql(finalAlias);\n const aliasPart = aliasSql ? ` AS ${aliasSql}` : '';\n\n const prefix = (expressionParent instanceof FromExpr || expressionParent instanceof JoinExpr || expressionParent instanceof LateralExpr)\n ? ''\n : `${this.sql(value)} FROM `;\n\n return `${prefix}${explode}${aliasPart}`;\n }\n\n showSql (expression: ShowExpr): string {\n const terse = expression.args.terse ? 'TERSE ' : '';\n const history = expression.args.history ? ' HISTORY' : '';\n\n let like = this.sql(expression, 'like');\n like = like ? ` LIKE ${like}` : '';\n\n let scope = this.sql(expression, 'scope');\n scope = scope ? ` ${scope}` : '';\n\n let scopeKind = this.sql(expression, 'scopeKind');\n if (scopeKind) {\n scopeKind = ` IN ${scopeKind}`;\n }\n\n let startsWith = this.sql(expression, 'startsWith');\n if (startsWith) {\n startsWith = ` STARTS WITH ${startsWith}`;\n }\n\n const limit = this.sql(expression, 'limit');\n\n let from = this.sql(expression, 'from');\n if (from) {\n from = ` FROM ${from}`;\n }\n\n let privileges = this.expressions(expression, {\n key: 'privileges',\n flat: true,\n });\n privileges = privileges ? ` WITH PRIVILEGES ${privileges}` : '';\n\n return `SHOW ${terse}${expression.name}${history}${like}${scopeKind}${scope}${startsWith}${limit}${from}${privileges}`;\n }\n\n describeSql (expression: DescribeExpr): string {\n const kindValue = expression.args.kind || 'TABLE';\n const kind = kindValue ? ` ${kindValue}` : '';\n const thisNode = ` ${this.sql(expression, 'this')}`;\n\n let expressions = this.expressions(expression, {\n flat: true,\n });\n expressions = expressions ? ` ${expressions}` : '';\n\n return `DESCRIBE${kind}${thisNode}${expressions}`;\n }\n\n generatedAsIdentityColumnConstraintSql (expression: GeneratedAsIdentityColumnConstraintExpr): string {\n const start = expression.args.start ? ` START ${expression.args.start}` : '';\n const increment = expression.args.increment ? ` INCREMENT ${expression.args.increment}` : '';\n\n let orderClause = '';\n if (expression.args.order !== undefined) {\n orderClause = expression.args.order ? ' ORDER' : ' NOORDER';\n }\n\n return `AUTOINCREMENT${start}${increment}${orderClause}`;\n }\n\n clusterSql (expression: ClusterExpr): string {\n return `CLUSTER BY (${this.expressions(expression, {\n flat: true,\n })})`;\n }\n\n structSql (expression: StructExpr): string {\n if (expression.args.expressions?.length === 1) {\n const arg = expression.args.expressions[0];\n if (arg.isStar || (arg instanceof ILikeExpr && narrowInstanceOf(arg.args.this, Expression)?.isStar)) {\n return `{${this.sql(expression.args.expressions[0])}}`;\n }\n }\n\n const keys: ExpressionValue[] = [\n ];\n const values: ExpressionValue[] = [\n ];\n\n expression.args.expressions?.forEach((e, i) => {\n if (e instanceof PropertyEqExpr) {\n if (e.args.this !== undefined) {\n keys.push(\n e.args.this instanceof IdentifierExpr\n ? LiteralExpr.string(e.name)\n : e.args.this,\n );\n }\n if (e.args.expression !== undefined) {\n values.push(e.args.expression);\n }\n } else {\n keys.push(LiteralExpr.string(`_${i}`));\n values.push(e);\n }\n });\n\n const args: ExpressionValue[] = [\n ];\n for (let i = 0; i < keys.length; i++) {\n args.push(keys[i], values[i]);\n }\n\n return this.func('OBJECT_CONSTRUCT', args);\n }\n\n approxQuantileSql (expression: ApproxQuantileExpr): string {\n unsupportedArgs.call(this, expression, 'weight', 'accuracy');\n return this.func('APPROX_PERCENTILE', [\n expression.args.this,\n expression.args.quantile,\n ]);\n }\n\n alterSetSql (expression: AlterSetExpr): string {\n let exprs = this.expressions(expression, {\n flat: true,\n });\n exprs = exprs ? ` ${exprs}` : '';\n\n let fileFormat = this.expressions(expression, {\n key: 'fileFormat',\n flat: true,\n sep: ' ',\n });\n fileFormat = fileFormat ? ` STAGE_FILE_FORMAT = (${fileFormat})` : '';\n\n let copyOptions = this.expressions(expression, {\n key: 'copyOptions',\n flat: true,\n sep: ' ',\n });\n copyOptions = copyOptions ? ` STAGE_COPY_OPTIONS = (${copyOptions})` : '';\n\n let tag = this.expressions(expression, {\n key: 'tag',\n flat: true,\n });\n tag = tag ? ` TAG ${tag}` : '';\n\n return `SET${exprs}${fileFormat}${copyOptions}${tag}`;\n }\n\n strToTimeSql (expression: StrToTimeExpr): string {\n const targetType = expression.args.targetType;\n let typeEnum: ExpressionValue | undefined;\n\n if (targetType instanceof DataTypeExpr) {\n typeEnum = targetType.args.this?.toString();\n } else if (expression.type) {\n typeEnum = expression.type instanceof Expression ? expression.type.args.this?.toString() : expression.type.toString();\n } else {\n typeEnum = DataTypeExprKind.TIMESTAMP;\n }\n\n const funcName = TIMESTAMP_TYPES[(typeEnum || '') as DataTypeExprKind] || 'TO_TIMESTAMP';\n\n return this.func(\n `${expression.args.safe ? 'TRY_' : ''}${funcName}`,\n [\n expression.args.this,\n this.formatTime(expression),\n ],\n );\n }\n\n timestampSubSql (expression: TimestampSubExpr): string {\n return this.sql(\n new TimestampAddExpr({\n this: expression.args.this,\n expression: expression.args.expression?.mul(-1),\n unit: expression.args.unit,\n }),\n );\n }\n\n jsonExtractSql (expression: JsonExtractExpr): string {\n let thisNode = expression.args.this;\n\n if (\n !(thisNode instanceof ParseJsonExpr || thisNode instanceof JsonExtractExpr)\n && !expression.args.requiresJson\n ) {\n thisNode = new ParseJsonExpr({\n this: thisNode,\n });\n }\n\n return this.func('GET_PATH', [\n thisNode,\n expression.args.expression,\n ]);\n }\n\n timeToStrSql (expression: TimeToStrExpr): string {\n let thisNode = expression.args.this;\n if (thisNode instanceof LiteralExpr && thisNode.isString) {\n thisNode = new CastExpr({\n this: thisNode,\n to: DataTypeExpr.build(DataTypeExprKind.TIMESTAMP),\n });\n }\n\n return this.func('TO_CHAR', [\n thisNode,\n this.formatTime(expression),\n ]);\n }\n\n dateSubSql (expression: DateSubExpr): string {\n const value = expression.args.expression;\n if (value) {\n value.replace(value.mul(-1));\n } else {\n this.unsupported('DateSub cannot be transpiled if the subtracted count is unknown');\n }\n\n return dateDeltaSql('DATEADD').call(this, expression);\n }\n\n selectSql (expression: SelectExpr): string {\n const limit = expression.args.limit;\n const offset = expression.args.offset;\n if (offset && !limit) {\n expression.limit(null_(), {\n copy: false,\n });\n }\n return super.selectSql(expression);\n }\n\n createableSql (expression: CreateExpr, locations: Map<PropertiesLocation, Expression[]>): string {\n const isMaterialized = expression.find(MaterializedPropertyExpr);\n const copyGrantsProperty = expression.find(CopyGrantsPropertyExpr);\n\n if (expression.args.kind === CreateExprKind.VIEW && isMaterialized && copyGrantsProperty) {\n const postSchemaProperties = locations.get(PropertiesLocation.POST_SCHEMA) || [\n ];\n const index = postSchemaProperties.indexOf(copyGrantsProperty);\n if (index !== -1) {\n postSchemaProperties.splice(index, 1);\n }\n\n const thisName = this.sql(expression.args.this, 'this');\n const copyGrants = this.sql(copyGrantsProperty);\n let thisSchema = this.schemaColumnsSql(expression.args.this as SchemaExpr);\n thisSchema = thisSchema ? `${this.sep()}${thisSchema}` : '';\n\n return `${thisName}${this.sep()}${copyGrants}${thisSchema}`;\n }\n\n return super.createableSql(expression, locations);\n }\n\n arrayAggSql (expression: ArrayAggExpr): string {\n const thisNode = expression.args.this;\n const order = thisNode instanceof OrderExpr ? thisNode : undefined;\n\n if (order) {\n expression.setArgKey('this', order.args.this?.pop());\n }\n\n let exprSql = super.arrayAggSql(expression);\n\n if (order) {\n exprSql = this.sql(new WithinGroupExpr({\n this: exprSql,\n expression: order,\n }));\n }\n\n return exprSql;\n }\n\n arraySql (expression: ArrayExpr): string {\n const firstExpr = seqGet(expression.args.expressions || [\n ], 0);\n\n if (firstExpr instanceof SelectExpr) {\n if (firstExpr.text('kind').toUpperCase() === 'STRUCT') {\n const objectConstructArgs: Expression[] = [\n ];\n\n firstExpr.args.expressions?.forEach((expr) => {\n const name = expr instanceof AliasExpr ? expr.args.this : expr;\n objectConstructArgs.push(LiteralExpr.string(expr.aliasOrName), name ?? null_());\n });\n\n const arrayAgg = new ArrayAggExpr({\n this: buildObjectConstruct(objectConstructArgs),\n });\n\n firstExpr.setArgKey('kind', undefined);\n firstExpr.setArgKey('expressions', [\n arrayAgg,\n ]);\n\n return this.sql(firstExpr.subquery());\n }\n }\n\n return inlineArraySql.call(this, expression);\n }\n\n currentDateSql (expression: CurrentDateExpr): string {\n const zone = this.sql(expression, 'this');\n if (!zone) {\n return super.currentDateSql(expression);\n }\n\n const expr = new CastExpr({\n this: new ConvertTimezoneExpr({\n targetTz: zone,\n timestamp: new CurrentTimestampExpr({}),\n }),\n to: DataTypeExpr.build(DataTypeExprKind.DATE),\n });\n return this.sql(expr);\n }\n\n dotSql (expression: DotExpr): string {\n let thisNode = expression.args.this;\n\n if (thisNode instanceof Expression && !thisNode?.type) {\n thisNode = annotateTypes(thisNode, {\n dialect: this.dialect,\n });\n }\n\n if (!(thisNode instanceof DotExpr) && isType(thisNode, DataTypeExprKind.STRUCT)) {\n return `${this.sql(thisNode)}:${this.sql(expression, 'expression')}`;\n }\n\n return super.dotSql(expression);\n }\n\n modelAttributeSql (expression: ModelAttributeExpr): string {\n return `${this.sql(expression, 'this')}!${this.sql(expression, 'expression')}`;\n }\n\n formatSql (expression: FormatExpr): string {\n if (expression.name.toLowerCase() === '%s' && expression.args.expressions?.length === 1) {\n return this.func('TO_CHAR', [\n expression.args.expressions[0],\n ]);\n }\n\n return this.functionFallbackSql(expression);\n }\n\n splitPartSql (expression: SplitPartExpr): string {\n if (!expression.args.delimiter) {\n expression.setArgKey('delimiter', LiteralExpr.string(' '));\n }\n\n if (!expression.args.partIndex) {\n expression.setArgKey('partIndex', LiteralExpr.number(1));\n }\n\n return renameFunc('SPLIT_PART').call(this, expression);\n }\n\n uniformSql (expression: UniformExpr): string {\n let gen = expression.args.gen;\n const seed = expression.args.seed;\n\n if (seed) {\n gen = new RandExpr({\n this: seed,\n });\n }\n\n if (!gen) {\n gen = new RandExpr();\n }\n\n return this.func('UNIFORM', [\n expression.args.this,\n expression.args.expression,\n gen,\n ]);\n }\n}\n\nexport class Snowflake extends Dialect {\n static DIALECT_NAME = Dialects.SNOWFLAKE;\n\n @cache\n static get NORMALIZATION_STRATEGY () {\n return NormalizationStrategy.UPPERCASE;\n }\n\n @cache\n static get NULL_ORDERING () {\n return NullOrdering.NULLS_ARE_LARGE;\n }\n\n static TIME_FORMAT = '\\'YYYY-MM-DD HH24:MI:SS\\'';\n static SUPPORTS_USER_DEFINED_TYPES = false;\n\n @cache\n static get EXPRESSION_METADATA () {\n return new Map(SnowflakeTyping.EXPRESSION_METADATA);\n }\n\n static SUPPORTS_SEMI_ANTI_JOIN = false;\n static PREFER_CTE_ALIAS_COLUMN = true;\n static TABLESAMPLE_SIZE_IS_PERCENT = true;\n static COPY_PARAMS_ARE_CSV = false;\n static ARRAY_AGG_INCLUDES_NULLS = undefined;\n static ARRAY_FUNCS_PROPAGATES_NULLS = true;\n static ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = false;\n static TRY_CAST_REQUIRES_STRING = true;\n static SUPPORTS_ALIAS_REFS_IN_JOIN_CONDITIONS = true;\n static LEAST_GREATEST_IGNORES_NULLS = false;\n\n static INITCAP_DEFAULT_DELIMITER_CHARS = ' \\t\\n\\r\\f\\v!?@\"^#$&~_,.:;+\\\\-*%/|\\\\[\\\\](){}<>';\n\n @cache\n static get INVERSE_TIME_MAPPING () {\n return {\n 'T': 'T', // Prevent 'T' from being mapped back to '\"T\"'\n '%Y': 'yyyy',\n '%y': 'yy',\n '%B': 'MMMM',\n '%b': 'MON',\n '%m': 'mm',\n '%d': 'DD',\n '%-d': 'dd',\n '%a': 'DY',\n '%w': 'dy',\n '%H': 'HH24',\n '%I': 'HH12',\n '%M': 'MI',\n '%S': 'SS',\n '%f_nine': 'FF',\n '%f_zero': 'FF0',\n '%f_one': 'FF1',\n '%f_two': 'FF2',\n '%f_three': 'FF3',\n '%f_four': 'FF4',\n '%f_five': 'FF5',\n '%f': 'FF6',\n '%f_seven': 'FF7',\n '%f_eight': 'FF8',\n '%z': 'TZHTZM',\n '%:z': 'TZH:TZM',\n '%-z': 'TZH',\n '%p': 'AM/PM',\n '%A': 'EEEE',\n '%j': 'DDD',\n '%C': 'CC',\n };\n }\n\n @cache\n static get TIME_MAPPING () {\n return {\n 'YYYY': '%Y',\n 'yyyy': '%Y',\n 'YY': '%y',\n 'yy': '%y',\n 'MMMM': '%B',\n 'mmmm': '%B',\n 'MON': '%b',\n 'mon': '%b',\n 'MM': '%m',\n 'mm': '%m',\n 'DD': '%d',\n 'dd': '%-d',\n 'DY': '%a',\n 'dy': '%w',\n 'HH24': '%H',\n 'hh24': '%H',\n 'HH12': '%I',\n 'hh12': '%I',\n 'MI': '%M',\n 'mi': '%M',\n 'SS': '%S',\n 'ss': '%S',\n 'FF': '%f_nine',\n 'ff': '%f_nine',\n 'FF0': '%f_zero',\n 'ff0': '%f_zero',\n 'FF1': '%f_one',\n 'ff1': '%f_one',\n 'FF2': '%f_two',\n 'ff2': '%f_two',\n 'FF3': '%f_three',\n 'ff3': '%f_three',\n 'FF4': '%f_four',\n 'ff4': '%f_four',\n 'FF5': '%f_five',\n 'ff5': '%f_five',\n 'FF6': '%f',\n 'ff6': '%f',\n 'FF7': '%f_seven',\n 'ff7': '%f_seven',\n 'FF8': '%f_eight',\n 'ff8': '%f_eight',\n 'FF9': '%f_nine',\n 'ff9': '%f_nine',\n 'TZHTZM': '%z',\n 'tzhtzm': '%z',\n 'TZH:TZM': '%:z',\n 'tzh:tzm': '%:z',\n 'TZH': '%-z',\n 'tzh': '%-z',\n '\"T\"': 'T',\n 'AM': '%p',\n 'am': '%p',\n 'PM': '%p',\n 'pm': '%p',\n };\n }\n\n @cache\n static get DATE_PART_MAPPING (): Record<string, string> {\n return {\n ...Dialect.DATE_PART_MAPPING,\n ISOWEEK: 'WEEKISO',\n EPOCH_SECOND: 'EPOCH_SECOND',\n EPOCH_SECONDS: 'EPOCH_SECOND',\n };\n }\n\n @cache\n static get PSEUDOCOLUMNS () {\n return new Set([\n 'LEVEL',\n ]);\n }\n\n canQuote (identifier: IdentifierExpr, options: {identify?: string | boolean} = {}): boolean {\n const {\n identify = 'safe',\n } = options;\n // This disables quoting DUAL in SELECT ... FROM DUAL, because Snowflake treats an\n // unquoted DUAL keyword in a special way and does not map it to a user-defined table\n return (\n super.canQuote(identifier, {\n identify,\n })\n && !(\n identifier.parent instanceof TableExpr\n && !identifier.args.quoted\n && identifier.name.toLowerCase() === 'dual'\n )\n );\n }\n\n static JsonPathTokenizer = SnowflakeJsonPathTokenizer;\n static Tokenizer = SnowflakeTokenizer;\n static Parser = SnowflakeParser;\n static Generator = SnowflakeGenerator;\n}\n\nDialect.register(Dialects.SNOWFLAKE, Snowflake);\n"],"mappings":"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C,GAAwCtC,EAA0C,CACzF,IAAMuC,EAAgBvC,EAAW,KAAK,WAChCwC,EAAapC,EAAamC,EAAe1B,CAAY,EAAI0B,cAE/D,YAAK,QAAQvC,EAAYwC,CAAU,EAC5BxC,CACT,CAvRA,IAAAyC,GAAAC,GA0RED,GAAA,CAACE,GADI,IAAMC,GAAN,KAAsB,CAE3B,WAAW,qBAA2C,CACpD,IAAMC,EAA0B,IAAI,IAAIC,GAAc,mBAAmB,EAEnEC,EAAS,CAACC,EAA8BC,IAAkC,CAC9E,QAAWC,KAAQF,EAAOH,EAAI,IAAIK,EAAMD,CAAI,CAC9C,EAEA,OAAAF,EAAO,CACLI,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,UAAW,CAACC,EAAkBC,IAAkBD,EAAE,eAAeC,EAAG,CAClE,MACF,CAAC,CACH,CAAC,EAEDlB,EAAO,CACLmB,GACAC,GACAC,GACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,eACF,CAAC,EAEDnC,EAAO,CACLoC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,gBACF,CAAC,EAED7C,EAAO,CACL8C,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,gBACF,CAAC,EAED9D,EAAO,CACL+D,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,iBACF,CAAC,EAEDxE,EAAO,CACLyE,GACAC,EACF,EAAG,CACD,cACF,CAAC,EAED1E,EAAO,CACL2E,EACAC,EACAC,EACAC,GACAC,GACAC,CACF,EAAG,CACD,UAAW,CAAC/D,EAAkBC,IAAkBD,EAAE,QAAQC,EAAGpD,EAAa,MAAM,SAAU,CACxF,QAAS,WACX,CAAC,CAAC,CACJ,CAAC,EAEDkC,EAAO,CACLiF,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,gBACF,CAAC,EAED1F,EAAO,CACL2F,GACAC,EACF,EAAG,CACD,kBACF,CAAC,EAED5F,EAAO,CACL6F,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,UAAW,CAACvG,EAAkBC,IAAkB5B,GAA8B,KAAK2B,EAAGC,CAAC,CACzF,CAAC,EAEDlB,EAAO,CACLyH,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,aACF,CAAC,EAEDnI,EAAO,CACLoI,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,gBACF,CAAC,EAED3I,EAAO,CACL4I,GACAC,GACAC,GACAC,EACF,EAAG,CACD,aACF,CAAC,EAEDjJ,EAAI,IAAIkJ,GAAY,CAClB,cACF,CAAC,EAEDhJ,EAAO,CACLiJ,GACAC,EACF,EAAG,CACD,cACF,CAAC,EAEDlJ,EAAO,CACLmJ,EACAC,EACF,EAAG,CACD,sBACF,CAAC,EAEDtJ,EAAI,IAAIuJ,GAAa,CACnB,iBACF,CAAC,EAEDrJ,EAAO,CACLsJ,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EAAG,CACD,iBACF,CAAC,EAED/L,EAAO,CACLgM,GACAC,EACF,EAAG,CACD,iBACF,CAAC,EAEDjM,EAAO,CACLkM,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,EACA,CACEwQ,GACAvC,EAAW,CACTwC,EACF,CAAC,CACH,EACA,CACEC,GACAzC,EAAW,CACTwC,EACF,CAAC,CACH,EACA,CACEtV,GACA8S,EAAW,CACT/S,EACF,CAAC,CACH,EACA,CACEmD,EACAC,EACF,EACA,CACEiJ,GACAjJ,EACF,EACA,CACEqS,GACAxW,EACF,EACA,CACEyW,GACA9C,EAAW,QAAQ,CACrB,EACA,CACE1Q,EACA6Q,EAAW,CACT4C,GACAC,GACAC,GAA0B,EAC1BC,GACApT,GACAyB,GACAwB,EACF,CAAC,CACH,EACA,CACE8G,GACAmG,EAAW,MAAM,CACnB,EACA,CACEpG,GACAoG,EAAW,aAAa,CAC1B,EACA,CACEhH,GACAgH,EAAW,YAAY,CACzB,EACA,CACE/G,GACA+G,EAAW,oBAAoB,CACjC,EACA,CACE9G,GACA8G,EAAW,oBAAoB,CACjC,EACA,CACEmD,GACAnD,EAAW,SAAS,CACtB,EACA,CACEtI,GACAsI,EAAW,YAAY,CACzB,EACA,CACE3E,GACA2E,EAAW,MAAM,CACnB,EACA,CACElW,GACAkW,EAAW,kBAAkB,CAC/B,EACA,CACEoD,GACApD,EAAW,YAAY,CACzB,EACA,CACEqD,GACArD,EAAW,UAAU,CACvB,EACA,CACEsD,GACA,SAA2BpR,EAAoB,CAC7C,OAAOqR,GAAe,KAAK,KAAMrR,EAAG,CAClC,SAAU,YACV,iBAAkB,EACpB,CAAC,CACH,CACF,EACA,CACEsR,GACA,SAA2BtR,EAAkB,CAC3C,OAAO,KAAK,KAAK,OAAQ,CACvBA,EAAE,KAAK,KACP,KAAK,WAAWA,CAAC,CACnB,CAAC,CACH,CACF,EACA,CACEuR,GACAzD,EAAW,iBAAiB,CAC9B,EACA,CACE0D,GACA1D,EAAW,QAAQ,CACrB,EACA,CACE2D,GACA3D,EAAW,cAAc,CAC3B,EACA,CACE7F,GACA0G,EAAa,SAAS,CACxB,EACA,CACE+C,GACA,SAA2B1R,EAAkB,CAC3C,OAAO,KAAK,KAAK,aAAc,CAC7BA,EAAE,KAAK,KACPA,EAAE,KAAK,WACP2R,GAAU3R,C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","names":["DATE_PARTS","MAX_PRECISION","MAX_SCALE","annotateReverse","expression","annotateTimestampFromParts","annotateDateOrTimeAdd","thisArg","isInstanceOf","Expression","annotateDecodeCase","expressions","returnTypes","i","lastType","retType","narrowedRetType","DataTypeExpr","annotateArgMaxMin","thisType","annotateWithinGroup","inner","orderExpr","orderExprs","OrderExpr","PercentileDiscExpr","PercentileContExpr","OrderedExpr","firstThis","firstType","annotateMedian","inputType","exprs","filterInstanceOf","precision","scale","newPrecision","newScale","newType","annotateVariance","annotateKurtosis","annotateMathWithFloatDecfloat","annotateStrToTime","targetTypeArg","targetType","_EXPRESSION_METADATA_dec","_init","cache","SnowflakeTyping","map","DialectTyping","extend","types","data","type","AddMonthsExpr","CeilExpr","DateTruncExpr","FloorExpr","LeftExpr","ModeExpr","PadExpr","RightExpr","RoundExpr","StuffExpr","SubstringExpr","TimeSliceExpr","TimestampTruncExpr","s","e","ApproxTopKExpr","ApproxTopKEstimateExpr","ArrayExpr","ArrayAggExpr","ArrayAppendExpr","ArrayCompactExpr","ArrayConcatExpr","ArrayConstructCompactExpr","ArrayPrependExpr","ArrayRemoveExpr","ArraysZipExpr","ArrayUniqueAggExpr","ArrayUnionAggExpr","MapKeysExpr","RegexpExtractAllExpr","SplitExpr","StringToArrayExpr","BitmapBitPositionExpr","BitmapBucketNumberExpr","BitmapCountExpr","FactorialExpr","GroupingIdExpr","Md5NumberLower64Expr","Md5NumberUpper64Expr","RandExpr","Seq8Expr","ZipfExpr","Base64DecodeBinaryExpr","BitmapConstructAggExpr","BitmapOrAggExpr","CompressExpr","DecompressBinaryExpr","DecryptExpr","DecryptRawExpr","EncryptExpr","EncryptRawExpr","HexStringExpr","Md5DigestExpr","Sha1DigestExpr","Sha2DigestExpr","ToBinaryExpr","TryBase64DecodeBinaryExpr","TryHexDecodeBinaryExpr","UnhexExpr","BoolandExpr","BoolnotExpr","BoolorExpr","BoolxorAggExpr","EqualNullExpr","IsNullValueExpr","MapContainsKeyExpr","SearchExpr","SearchIpExpr","ToBooleanExpr","NextDayExpr","PreviousDayExpr","BitwiseAndAggExpr","BitwiseOrAggExpr","BitwiseXorAggExpr","RegexpCountExpr","RegexpInstrExpr","ToNumberExpr","ApproxPercentileEstimateExpr","ApproximateSimilarityExpr","CosineDistanceExpr","CovarPopExpr","CovarSampExpr","DotProductExpr","EuclideanDistanceExpr","ManhattanDistanceExpr","MonthsBetweenExpr","NormalExpr","ToDecfloatExpr","TryToDecfloatExpr","AcosExpr","AsinExpr","AtanExpr","Atan2Expr","CbrtExpr","CosExpr","CotExpr","DegreesExpr","ExpExpr","LnExpr","LogExpr","PowExpr","RadiansExpr","RegrAvgxExpr","RegrAvgyExpr","RegrCountExpr","RegrInterceptExpr","RegrR2Expr","RegrSlopeExpr","RegrSxxExpr","RegrSxyExpr","RegrSyyExpr","RegrValxExpr","RegrValyExpr","SinExpr","SqrtExpr","TanExpr","TanhExpr","ByteLengthExpr","GroupingExpr","JarowinklerSimilarityExpr","MapSizeExpr","MinuteExpr","RtrimmedLengthExpr","SecondExpr","Seq1Expr","Seq2Expr","Seq4Expr","WidthBucketExpr","ApproxPercentileAccumulateExpr","ApproxPercentileCombineExpr","ApproxTopKAccumulateExpr","ApproxTopKCombineExpr","ObjectAggExpr","ParseIpExpr","ParseUrlExpr","XmlGetExpr","MapCatExpr","MapDeleteExpr","MapInsertExpr","MapPickExpr","ToFileExpr","TimeFromPartsExpr","TsOrDsToTimeExpr","CurrentTimestampExpr","LocaltimestampExpr","QuarterExpr","AiAggExpr","AiClassifyExpr","AiSummarizeAggExpr","Base64DecodeStringExpr","Base64EncodeExpr","CheckJsonExpr","CheckXmlExpr","CollateExpr","CollationExpr","CurrentAccountExpr","CurrentAccountNameExpr","CurrentAvailableRolesExpr","CurrentClientExpr","CurrentDatabaseExpr","CurrentIpAddressExpr","CurrentSchemasExpr","CurrentSecondaryRolesExpr","CurrentSessionExpr","CurrentStatementExpr","CurrentVersionExpr","CurrentTransactionExpr","CurrentWarehouseExpr","CurrentOrganizationUserExpr","CurrentRegionExpr","CurrentRoleExpr","CurrentRoleTypeExpr","CurrentOrganizationNameExpr","DecompressStringExpr","HexDecodeStringExpr","HexEncodeExpr","MonthnameExpr","RandstrExpr","RegexpExtractExpr","RegexpReplaceExpr","RepeatExpr","ReplaceExpr","SoundexExpr","SoundexP123Expr","SplitPartExpr","TryBase64DecodeStringExpr","TryHexDecodeStringExpr","UuidExpr","MinhashExpr","MinhashCombineExpr","VarianceExpr","VariancePopExpr","ArgMaxExpr","ArgMinExpr","ConcatWsExpr","ConvertTimezoneExpr","DateAddExpr","DecodeCaseExpr","HashAggExpr","KurtosisExpr","MedianExpr","ReverseExpr","StrToTimeExpr","TimeAddExpr","TimestampFromPartsExpr","WithinGroupExpr","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","TIMESTAMP_TYPES","buildStrtok","args","LiteralExpr","SplitPartExpr","buildApproxTopK","ApproxTopKExpr","buildDateFromParts","DateFromPartsExpr","seqGet","buildDatetime","name","kind","options","safe","value","scaleOrFmt","intValue","IdentifierExpr","isInt","intScaleOrFmt","NegExpr","TryCastExpr","DataTypeExpr","CastExpr","unixExpr","UnixToTimeExpr","strtotimeExpr","buildFormattedTime","StrToTimeExpr","hasFormatString","Klass","TsOrDsToDateExpr","TsOrDsToTimeExpr","formattedExp","AnonymousExpr","buildObjectConstruct","expression","buildVarMap","StarMapExpr","StructExpr","k","i","PropertyEqExpr","buildDatediff","DateDiffExpr","mapDatePart","buildDateTimeAdd","ExprClass","buildBitwise","BitwiseAndExpr","BitwiseOrExpr","BitwiseXorExpr","result","binaryFromFunction","BitwiseLeftShiftExpr","BitwiseRightShiftExpr","buildIfFromDiv0","lhs","wrap","BinaryExpr","rhs","cond","EqExpr","IsExpr","null_","trueNode","falseNode","DivExpr","IfExpr","buildIfFromDiv0null","buildIfFromZeroifnull","buildSearch","kwargs","arg","KwargExpr","SearchExpr","buildIfFromNullifzero","regexpILikeSql","flag","buildRegexpReplace","regexpReplace","RegexpReplaceExpr","showParser","str","dateTruncToTimeWrapper","trunc","dateTruncToTime","unit","isTimeInput","TimestampTruncExpr","isDateUnit","DateTruncExpr","unqualifyPivotColumns","PivotExpr","unqualifyColumns","field","fieldExpr","PivotAnyExpr","unqualifiedFieldExpr","flattenStructuredTypesUnlessIceberg","CreateExpr","flattenStructuredType","node","isIceberg","IcebergPropertyExpr","SchemaExpr","schemaExpression","ColumnDefExpr","unnestGenerateDateArray","unnest","generateDateArray","start","end","step","IntervalExpr","unnestAlias","sequenceValueName","narrowInstanceOf","TableAliasExpr","dateAdd","DateAddExpr","numberSequence","SnowflakeParser","unnestParent","JoinExpr","select","SelectExpr","replaceColumnName","Expression","scope","buildScope","column","lateral","LateralExpr","transformGenerateDateArray","GenerateDateArrayExpr","parent","UnnestExpr","ArrayAggExpr","StarExpr","FromExpr","buildRegexpExtract","dialect","RegexpExtractExpr","regexpExtractSql","group","parameters","occurrence","position","jsonExtractValueArraySql","jsonExtract","JsonExtractExpr","ident","toIdentifier","thisNode","JsonValueArrayExpr","ParseJsonExpr","transformLambda","LambdaExpr","qualifyUnnestedColumns","unnests","takenSourceNames","columnSource","unnestToIdentifier","unnestIdentifier","origExpression","unnestColumns","unnestExpr","ArrayExpr","arrayExpr","e","structExpr","narrowedUnnestAlias","aliasColumns","aliasName","findNewName","aliasedUnnest","alias","c","unnestIdentifierName","table","unnestAncestor","ancestorIdentifier","eliminateDotVariantLookup","unnestAliases","findAllInScope","ColumnExpr","bracketLhs","bracketRhs","bracket","BracketExpr","buildTimestampFromParts","TimestampFromPartsExpr","buildRound","kwargMap","roundArgs","positionalKeys","positionalIdx","key","roundKey","RoundExpr","buildGenerator","genArgs","genKey","GeneratorExpr","buildTryToNumber","ToNumberExpr","_SINGLE_TOKENS_dec","_a","_init","SnowflakeJsonPathTokenizer","JsonPathTokenizer","cache","tokens","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","_COMMANDS_dec","_VAR_SINGLE_TOKENS_dec","_ORIGINAL_KEYWORDS_dec","_COMMENTS_dec","_RAW_STRINGS_dec","_HEX_STRINGS_dec","_STRING_ESCAPES_dec","SnowflakeTokenizer","Tokenizer","keywords","t","_COLUMN_OPERATORS_dec","_LAMBDAS_dec","_NON_TABLE_CREATABLES_dec","_SCHEMA_KINDS_dec","_FLATTEN_COLUMNS_dec","_STAGED_FILE_SINGLE_TOKENS_dec","_CONSTRAINT_PARSERS_dec","_SHOW_PARSERS_dec","_TYPE_CONVERTERS_dec","_PROPERTY_PARSERS_dec","_STATEMENT_PARSERS_dec","_ALTER_PARSERS_dec","_TIMESTAMPS_dec","_FUNCTION_PARSERS_dec","_FUNCTIONS_dec","_NO_PAREN_FUNCTIONS_dec","_COLON_PLACEHOLDER_TOKENS_dec","_TABLE_ALIAS_TOKENS_dec","_ID_VAR_TOKENS_dec","_SnowflakeParser","Parser","s","LocaltimeExpr","functions","AddMonthsExpr","ApproxQuantileExpr","ArrayContainsExpr","GenerateSeriesExpr","SubExpr","SortArrayExpr","FlattenExpr","BitwiseNotExpr","BitwiseAndAggExpr","BitwiseOrAggExpr","BitwiseXorAggExpr","BitmapOrAggExpr","BoolandExpr","BoolorExpr","BoolnotExpr","XorExpr","CorrExpr","DaynameExpr","DayOfWeekIsoExpr","LevenshteinExpr","ExplodeExpr","GetExtractExpr","CurrentTimestampExpr","GreatestExpr","LeastExpr","UnhexExpr","Md5Expr","Md5DigestExpr","Md5NumberLower64Expr","Md5NumberUpper64Expr","MonthnameExpr","LastDayExpr","LengthExpr","JsonKeysExpr","ByteLengthExpr","ParseUrlExpr","RegexpExtractAllExpr","buildReplaceWithOptionalReplacement","RegexpLikeExpr","Sha1DigestExpr","ShaExpr","Sha2DigestExpr","Sha2Expr","PowExpr","StddevExpr","TableFromRowsExpr","TimeAddExpr","TimeFromPartsExpr","buildTrunc","DecryptExpr","DecryptRawExpr","ToBinaryExpr","ToBooleanExpr","ToDoubleExpr","ToFileExpr","buildTimeToStrOrToChar","JsonFormatExpr","CosineDistanceExpr","DotProductExpr","ManhattanDistanceExpr","EuclideanDistanceExpr","buildLike","LikeExpr","ILikeExpr","SkewnessExpr","WeekOfYearExpr","WeekExpr","parsers","SetExpr","UsingTemplatePropertyExpr","buildDefaultDecimalType","expressions","attr","ModelAttributeExpr","TableExpr","DirectoryStageExpr","VarExpr","roles","UseExpr","query","InExpr","QueryExpr","NeqExpr","AllExpr","NotExpr","TagsExpr","policy","MaskingPolicyColumnConstraintExpr","ProjectionPolicyColumnConstraintExpr","tableNode","ExtractExpr","isMap","tableAlias","columns","col","schema","isDbReference","fileFormat","pattern","wrapped","tableFromRows","anyToken","identifier","scopeKind","terse","history","like","ShowExpr","PutExpr","target","GetExpr","LocationPropertyExpr","typ","ForeignKeyExpr","FileFormatPropertyExpr","CredentialsPropertyExpr","keyword","SemanticViewExpr","unset","tag","setNode","expr","SetItemExpr","NthValueExpr","fromFirst","_RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS_dec","_UNSUPPORTED_VALUES_EXPRESSIONS_dec","_PROPERTIES_LOCATION_dec","_TOKEN_MAPPING_dec","_TYPE_MAPPING_dec","_SUPPORTED_JSON_PATH_PARTS_dec","_ORIGINAL_TRANSFORMS_dec","_STRUCT_DELIMITER_dec","_AFTER_HAVING_MODIFIER_TRANSFORMS_dec","SnowflakeGenerator","Generator","modifiers","m","ApproxDistinctExpr","renameFunc","ArgMaxExpr","ArgMinExpr","preprocess","inheritStructFieldNames","ArrayConcatExpr","arrayConcatSql","ArrayAppendExpr","arrayAppendSql","ArrayPrependExpr","ArrayIntersectExpr","AtTimeZoneExpr","LocaltimestampExpr","dateDeltaSql","DatetimeAddExpr","DatetimeDiffExpr","timestampDiffSql","DateStrToDateExpr","dateStrToDateSql","DayOfMonthExpr","DayOfWeekExpr","DayOfYearExpr","FromTimeZoneExpr","GroupConcatExpr","groupConcatSql","ifSql","JsonExtractArrayExpr","JsonExtractScalarExpr","JsonObjectExpr","JsonPathRootExpr","unsupportedArgs","LogicalAndExpr","LogicalOrExpr","MapExpr","varMapSql","MakeIntervalExpr","noMakeIntervalSql","MaxExpr","maxOrGreatest","MinExpr","minOrLeast","PartitionedByPropertyExpr","PercentileContExpr","addWithinGroupForPercentiles","PercentileDiscExpr","RegexpILikeExpr","RandExpr","eliminateWindowClause","eliminateDistinctOn","explodeProjectionToUnnest","eliminateSemiAndAntiJoins","LowerHexExpr","StartsWithExpr","EndsWithExpr","StrPositionExpr","strPositionSql","StrToDateExpr","StringToArrayExpr","StuffExpr","StPointExpr","TimeSliceExpr","unitToStr","TimestampExpr","noTimestampSql","TimestampAddExpr","TimestampDiffExpr","timestampTruncSql","TimeStrToTimeExpr","timeStrToTimeSql","TimeToUnixExpr","ToArrayExpr","ToCharExpr","TsOrDsAddExpr","TsOrDsDiffExpr","UuidExpr","VarMapExpr","YearOfWeekExpr","YearOfWeekIsoExpr","ArrayConcatAggExpr","JsonPathKeyExpr","JsonPathSubscriptExpr","SetPropertyExpr","VolatilePropertyExpr","properties","valuesAsTable","fieldType","milli","milliToNano","annotateTypes","rowcount","timeLimit","offset","unnestAliasColumns","finalAlias","tableInput","expressionParent","explode","aliasSql","aliasPart","startsWith","limit","from","privileges","kindValue","increment","orderClause","keys","values","exprs","copyOptions","targetType","typeEnum","funcName","locations","isMaterialized","MaterializedPropertyExpr","copyGrantsProperty","CopyGrantsPropertyExpr","postSchemaProperties","index","thisName","copyGrants","thisSchema","order","OrderExpr","exprSql","WithinGroupExpr","firstExpr","objectConstructArgs","AliasExpr","arrayAgg","inlineArraySql","zone","ConvertTimezoneExpr","DotExpr","isType","gen","seed","_PSEUDOCOLUMNS_dec","_DATE_PART_MAPPING_dec","_TIME_MAPPING_dec","_INVERSE_TIME_MAPPING_dec","_EXPRESSION_METADATA_dec","_NULL_ORDERING_dec","_NORMALIZATION_STRATEGY_dec","Snowflake","Dialect","SnowflakeTyping","identify"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk2Z3O2CFMcjs = require('../chunk-2Z3O2CFM.cjs');var L,P,u,x,U,_,E= exports.SolrParser =class extends(U=_chunk2Z3O2CFMcjs.za,x=[_chunk2Z3O2CFMcjs.r],u=[_chunk2Z3O2CFMcjs.r],P=[_chunk2Z3O2CFMcjs.r],L=[_chunk2Z3O2CFMcjs.r],U){static get ID_VAR_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.ID_VAR_TOKENS,"sessionUser","currentCatalog","straightJoin"])}static get NO_PAREN_FUNCTIONS(){let i={..._chunk2Z3O2CFMcjs.za.NO_PAREN_FUNCTIONS};return delete i.localtime,delete i.localtimestamp,i}static get DISJUNCTION(){return{..._chunk2Z3O2CFMcjs.za.DISJUNCTION,dpipe:_chunk2Z3O2CFMcjs.ln}}static get TABLE_ALIAS_TOKENS(){return new Set([..._chunk2Z3O2CFMcjs.za.TABLE_ALIAS_TOKENS,"straightJoin"])}};_=_chunk2Z3O2CFMcjs.a.call(void 0, U),_chunk2Z3O2CFMcjs.d.call(void 0, _,10,"ID_VAR_TOKENS",x,E),_chunk2Z3O2CFMcjs.d.call(void 0, _,10,"NO_PAREN_FUNCTIONS",u,E),_chunk2Z3O2CFMcjs.d.call(void 0, _,10,"DISJUNCTION",P,E),_chunk2Z3O2CFMcjs.d.call(void 0, _,10,"TABLE_ALIAS_TOKENS",L,E),_chunk2Z3O2CFMcjs.b.call(void 0, _,E),_chunk2Z3O2CFMcjs.c.call(void 0, _,3,E);var d,g,M,R,I= exports.SolrTokenizer =class extends(M=_chunk2Z3O2CFMcjs.Xq,g=[_chunk2Z3O2CFMcjs.r],d=[_chunk2Z3O2CFMcjs.r],M){static get QUOTES(){return["'"]}static get IDENTIFIERS(){return["`"]}};R=_chunk2Z3O2CFMcjs.a.call(void 0, M),_chunk2Z3O2CFMcjs.d.call(void 0, R,10,"QUOTES",g,I),_chunk2Z3O2CFMcjs.d.call(void 0, R,10,"IDENTIFIERS",d,I),_chunk2Z3O2CFMcjs.b.call(void 0, R,I),_chunk2Z3O2CFMcjs.c.call(void 0, R,3,I);var F,y,S,e= exports.SolrGenerator =class extends(y=_chunk2Z3O2CFMcjs.lp,F=[_chunk2Z3O2CFMcjs.r],y){static get AFTER_HAVING_MODIFIER_TRANSFORMS(){let i=new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);return["cluster","distribute","sort"].forEach(V=>i.delete(V)),i}};S=_chunk2Z3O2CFMcjs.a.call(void 0, y),_chunk2Z3O2CFMcjs.d.call(void 0, S,10,"AFTER_HAVING_MODIFIER_TRANSFORMS",F,e),_chunk2Z3O2CFMcjs.b.call(void 0, S,e),_chunk2Z3O2CFMcjs.c.call(void 0, S,3,e),e.SUPPORTS_DECODE_CASE=!1,e.SELECT_KINDS=[],e.TRY_SUPPORTED=!1,e.SUPPORTS_UESCAPE=!1;var J,K,m,t= exports.Solr =class extends(K=_chunk2Z3O2CFMcjs.op,J=[_chunk2Z3O2CFMcjs.r],K){static get NORMALIZATION_STRATEGY(){return"caseInsensitive"}};m=_chunk2Z3O2CFMcjs.a.call(void 0, K),_chunk2Z3O2CFMcjs.d.call(void 0, m,10,"NORMALIZATION_STRATEGY",J,t),_chunk2Z3O2CFMcjs.b.call(void 0, m,t),_chunk2Z3O2CFMcjs.c.call(void 0, m,3,t),t.DIALECT_NAME="solr",t.DPIPE_IS_STRING_CONCAT=!1,t.SUPPORTS_SEMI_ANTI_JOIN=!1,t.Parser=E,t.Tokenizer=I,t.Generator=e;_chunk2Z3O2CFMcjs.op.register("solr",t);exports.Solr = t; exports.SolrGenerator = e; exports.SolrParser = E; exports.SolrTokenizer = I;
|
|
2
|
+
//# sourceMappingURL=solr.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/huydna/projects/sqlingo.js/dist/dialects/solr.cjs","../../src/dialects/solr.ts"],"names":["_TABLE_ALIAS_TOKENS_dec","_DISJUNCTION_dec","_NO_PAREN_FUNCTIONS_dec","_ID_VAR_TOKENS_dec","_a","_init","SolrParser","Parser","cache","noParenFunctions","OrExpr","__decoratorStart","__decorateElement","__decoratorMetadata","__runInitializers","_IDENTIFIERS_dec","_QUOTES_dec","SolrTokenizer","Tokenizer","_AFTER_HAVING_MODIFIER_TRANSFORMS_dec","SolrGenerator","Generator","modifiers","m","_NORMALIZATION_STRATEGY_dec","Solr","Dialect"],"mappings":"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","file":"/home/huydna/projects/sqlingo.js/dist/dialects/solr.cjs","sourcesContent":[null,"import {\n Parser,\n} from '../parser';\nimport {\n Tokenizer, TokenType,\n} from '../tokens';\nimport type {\n Expression,\n} from '../expressions';\nimport {\n OrExpr,\n} from '../expressions';\nimport {\n cache,\n} from '../port_internals';\nimport {\n Generator,\n} from '../generator';\nimport {\n Dialect, NormalizationStrategy, Dialects,\n} from './dialect';\n\nexport class SolrParser extends Parser {\n @cache\n static get ID_VAR_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.ID_VAR_TOKENS,\n TokenType.SESSION_USER,\n TokenType.CURRENT_CATALOG,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get NO_PAREN_FUNCTIONS () {\n const noParenFunctions = {\n ...Parser.NO_PAREN_FUNCTIONS,\n };\n delete noParenFunctions[TokenType.LOCALTIME];\n delete noParenFunctions[TokenType.LOCALTIMESTAMP];\n return noParenFunctions;\n }\n\n @cache\n static get DISJUNCTION (): Partial<Record<TokenType, typeof Expression>> {\n return {\n ...Parser.DISJUNCTION,\n [TokenType.DPIPE]: OrExpr,\n };\n }\n\n // port from _Dialect metaclass logic\n @cache\n static get TABLE_ALIAS_TOKENS (): Set<TokenType> {\n return new Set([\n ...Parser.TABLE_ALIAS_TOKENS,\n TokenType.STRAIGHT_JOIN,\n ]);\n }\n}\nexport class SolrTokenizer extends Tokenizer {\n @cache\n static get QUOTES () {\n return [\n '\\'',\n ];\n }\n\n @cache\n static get IDENTIFIERS () {\n return [\n '`',\n ];\n }\n}\n\nexport class SolrGenerator extends Generator {\n @cache\n static get AFTER_HAVING_MODIFIER_TRANSFORMS () {\n const modifiers = new Map(super.AFTER_HAVING_MODIFIER_TRANSFORMS);\n [\n 'cluster',\n 'distribute',\n 'sort',\n ].forEach((m) => modifiers.delete(m));\n return modifiers;\n }\n\n // port from _Dialect metaclass logic\n static SUPPORTS_DECODE_CASE = false;\n // port from _Dialect metaclass logic\n static readonly SELECT_KINDS: string[] = [\n ];\n // port from _Dialect metaclass logic\n static TRY_SUPPORTED = false;\n // port from _Dialect metaclass logic\n static SUPPORTS_UESCAPE = false;\n}\n\nexport class Solr extends Dialect {\n static DIALECT_NAME = Dialects.SOLR;\n\n @cache\n static get NORMALIZATION_STRATEGY () {\n return NormalizationStrategy.CASE_INSENSITIVE;\n }\n\n static DPIPE_IS_STRING_CONCAT = false;\n static SUPPORTS_SEMI_ANTI_JOIN = false;\n\n static Parser = SolrParser;\n static Tokenizer = SolrTokenizer;\n static Generator = SolrGenerator;\n}\n\nDialect.register(Dialects.SOLR, Solr);\n"]}
|