Edit on GitHub

sqlglot.typing.snowflake

  1from __future__ import annotations
  2
  3import typing as t
  4
  5from sqlglot import exp
  6from sqlglot.helper import seq_get
  7from sqlglot.typing import EXPRESSION_METADATA
  8
  9if t.TYPE_CHECKING:
 10    from sqlglot.optimizer.annotate_types import TypeAnnotator
 11
 12DATE_PARTS = {"DAY", "WEEK", "MONTH", "QUARTER", "YEAR"}
 13
 14MAX_PRECISION = 38
 15
 16MAX_SCALE = 37
 17
 18
 19def _annotate_reverse(self: TypeAnnotator, expression: exp.Reverse) -> exp.Reverse:
 20    expression = self._annotate_by_args(expression, "this")
 21    if expression.is_type(exp.DataType.Type.NULL):
 22        # Snowflake treats REVERSE(NULL) as a VARCHAR
 23        self._set_type(expression, exp.DataType.Type.VARCHAR)
 24
 25    return expression
 26
 27
 28def _annotate_timestamp_from_parts(
 29    self: TypeAnnotator, expression: exp.TimestampFromParts
 30) -> exp.TimestampFromParts:
 31    """Annotate TimestampFromParts with correct type based on arguments.
 32    TIMESTAMP_FROM_PARTS with time_zone -> TIMESTAMPTZ
 33    TIMESTAMP_FROM_PARTS without time_zone -> TIMESTAMP (defaults to TIMESTAMP_NTZ)
 34    """
 35    if expression.args.get("zone"):
 36        self._set_type(expression, exp.DataType.Type.TIMESTAMPTZ)
 37    else:
 38        self._set_type(expression, exp.DataType.Type.TIMESTAMP)
 39
 40    return expression
 41
 42
 43def _annotate_date_or_time_add(self: TypeAnnotator, expression: exp.Expression) -> exp.Expression:
 44    if (
 45        expression.this.is_type(exp.DataType.Type.DATE)
 46        and expression.text("unit").upper() not in DATE_PARTS
 47    ):
 48        self._set_type(expression, exp.DataType.Type.TIMESTAMPNTZ)
 49    else:
 50        self._annotate_by_args(expression, "this")
 51    return expression
 52
 53
 54def _annotate_decode_case(self: TypeAnnotator, expression: exp.DecodeCase) -> exp.DecodeCase:
 55    """Annotate DecodeCase with the type inferred from return values only.
 56
 57    DECODE uses the format: DECODE(expr, val1, ret1, val2, ret2, ..., default)
 58    We only look at the return values (ret1, ret2, ..., default) to determine the type,
 59    not the comparison values (val1, val2, ...) or the expression being compared.
 60    """
 61    expressions = expression.expressions
 62
 63    # Return values are at indices 2, 4, 6, ... and the last element (if even length)
 64    # DECODE(expr, val1, ret1, val2, ret2, ..., default)
 65    return_types = [expressions[i].type for i in range(2, len(expressions), 2)]
 66
 67    # If the total number of expressions is even, the last one is the default
 68    # Example:
 69    #   DECODE(x, 1, 'a', 2, 'b')             -> len=5 (odd), no default
 70    #   DECODE(x, 1, 'a', 2, 'b', 'default')  -> len=6 (even), has default
 71    if len(expressions) % 2 == 0:
 72        return_types.append(expressions[-1].type)
 73
 74    # Determine the common type from all return values
 75    last_type = None
 76    for ret_type in return_types:
 77        last_type = self._maybe_coerce(last_type or ret_type, ret_type)
 78
 79    self._set_type(expression, last_type)
 80    return expression
 81
 82
 83def _annotate_arg_max_min(self, expression):
 84    self._set_type(
 85        expression,
 86        exp.DataType.Type.ARRAY if expression.args.get("count") else expression.this.type,
 87    )
 88    return expression
 89
 90
 91def _annotate_within_group(self: TypeAnnotator, expression: exp.WithinGroup) -> exp.WithinGroup:
 92    """Annotate WithinGroup with correct type based on the inner function.
 93
 94    1) Annotate args first
 95    2) Check if this is PercentileDisc/PercentileCont and if so, re-annotate its type to match the ordered expression's type
 96    """
 97
 98    if (
 99        isinstance(expression.this, (exp.PercentileDisc, exp.PercentileCont))
100        and isinstance(order_expr := expression.expression, exp.Order)
101        and len(order_expr.expressions) == 1
102        and isinstance(ordered_expr := order_expr.expressions[0], exp.Ordered)
103    ):
104        self._set_type(expression, ordered_expr.this.type)
105
106    return expression
107
108
109def _annotate_median(self: TypeAnnotator, expression: exp.Median) -> exp.Median:
110    """Annotate MEDIAN function with correct return type.
111
112    Based on Snowflake documentation:
113    - If the expr is FLOAT/DOUBLE -> annotate as DOUBLE (FLOAT is a synonym for DOUBLE)
114    - If the expr is NUMBER(p, s) -> annotate as NUMBER(min(p+3, 38), min(s+3, 37))
115    """
116    # First annotate the argument to get its type
117    expression = self._annotate_by_args(expression, "this")
118
119    # Get the input type
120    input_type = expression.this.type
121
122    if input_type.is_type(exp.DataType.Type.DOUBLE):
123        # If input is FLOAT/DOUBLE, return DOUBLE (FLOAT is normalized to DOUBLE in Snowflake)
124        self._set_type(expression, exp.DataType.Type.DOUBLE)
125    else:
126        # If input is NUMBER(p, s), return NUMBER(min(p+3, 38), min(s+3, 37))
127        exprs = input_type.expressions
128
129        precision_expr = seq_get(exprs, 0)
130        precision = precision_expr.this.to_py() if precision_expr else MAX_PRECISION
131
132        scale_expr = seq_get(exprs, 1)
133        scale = scale_expr.this.to_py() if scale_expr else 0
134
135        new_precision = min(precision + 3, MAX_PRECISION)
136        new_scale = min(scale + 3, MAX_SCALE)
137
138        # Build the new NUMBER type
139        new_type = exp.DataType.build(f"NUMBER({new_precision}, {new_scale})", dialect="snowflake")
140        self._set_type(expression, new_type)
141
142    return expression
143
144
145def _annotate_variance(self: TypeAnnotator, expression: exp.Expression) -> exp.Expression:
146    """Annotate variance functions (VAR_POP, VAR_SAMP, VARIANCE, VARIANCE_POP) with correct return type.
147
148    Based on Snowflake behavior:
149    - DECFLOAT -> DECFLOAT(38)
150    - FLOAT/DOUBLE -> FLOAT
151    - INT, NUMBER(p, 0) -> NUMBER(38, 6)
152    - NUMBER(p, s) -> NUMBER(38, max(12, s))
153    """
154    # First annotate the argument to get its type
155    expression = self._annotate_by_args(expression, "this")
156
157    # Get the input type
158    input_type = expression.this.type
159
160    # Special case: DECFLOAT -> DECFLOAT(38)
161    if input_type.is_type(exp.DataType.Type.DECFLOAT):
162        self._set_type(expression, exp.DataType.build("DECFLOAT", dialect="snowflake"))
163    # Special case: FLOAT/DOUBLE -> DOUBLE
164    elif input_type.is_type(exp.DataType.Type.FLOAT, exp.DataType.Type.DOUBLE):
165        self._set_type(expression, exp.DataType.Type.DOUBLE)
166    # For NUMBER types: determine the scale
167    else:
168        exprs = input_type.expressions
169        scale_expr = seq_get(exprs, 1)
170        scale = scale_expr.this.to_py() if scale_expr else 0
171
172        # If scale is 0 (INT, BIGINT, NUMBER(p,0)): return NUMBER(38, 6)
173        # Otherwise, Snowflake appears to assign scale through the formula MAX(12, s)
174        new_scale = 6 if scale == 0 else max(12, scale)
175
176        # Build the new NUMBER type
177        new_type = exp.DataType.build(f"NUMBER({MAX_PRECISION}, {new_scale})", dialect="snowflake")
178        self._set_type(expression, new_type)
179
180    return expression
181
182
183def _annotate_kurtosis(self: TypeAnnotator, expression: exp.Kurtosis) -> exp.Kurtosis:
184    """Annotate KURTOSIS with correct return type.
185
186    Based on Snowflake behavior:
187    - DECFLOAT input -> DECFLOAT
188    - DOUBLE or FLOAT input -> DOUBLE
189    - Other numeric types (INT, NUMBER) -> NUMBER(38, 12)
190    """
191    expression = self._annotate_by_args(expression, "this")
192    input_type = expression.this.type
193
194    if input_type.is_type(exp.DataType.Type.DECFLOAT):
195        self._set_type(expression, exp.DataType.build("DECFLOAT", dialect="snowflake"))
196    elif input_type.is_type(exp.DataType.Type.FLOAT, exp.DataType.Type.DOUBLE):
197        self._set_type(expression, exp.DataType.Type.DOUBLE)
198    else:
199        self._set_type(
200            expression, exp.DataType.build(f"NUMBER({MAX_PRECISION}, 12)", dialect="snowflake")
201        )
202
203    return expression
204
205
206def _annotate_math_with_float_decfloat(
207    self: TypeAnnotator, expression: exp.Expression
208) -> exp.Expression:
209    """Annotate math functions that preserve  DECFLOAT but return DOUBLE for others.
210
211    In Snowflake, trigonometric and exponential math functions:
212    - If input is DECFLOAT -> return DECFLOAT
213    - For integer types (INT, BIGINT, etc.) -> return DOUBLE
214    - For other numeric types (NUMBER, DECIMAL, DOUBLE) -> return DOUBLE
215    """
216    expression = self._annotate_by_args(expression, "this")
217
218    # If input is DECFLOAT, preserve
219    if expression.this.is_type(exp.DataType.Type.DECFLOAT):
220        self._set_type(expression, expression.this.type)
221    else:
222        # For all other types (integers, decimals, etc.), return DOUBLE
223        self._set_type(expression, exp.DataType.Type.DOUBLE)
224
225    return expression
226
227
228def _annotate_str_to_time(self: TypeAnnotator, expression: exp.StrToTime) -> exp.StrToTime:
229    # target_type is stored as a DataType instance
230    target_type_arg = expression.args.get("target_type")
231    target_type = (
232        target_type_arg.this
233        if isinstance(target_type_arg, exp.DataType)
234        else exp.DataType.Type.TIMESTAMP
235    )
236    self._set_type(expression, target_type)
237    return expression
238
239
240EXPRESSION_METADATA = {
241    **EXPRESSION_METADATA,
242    **{
243        expr_type: {"annotator": lambda self, e: self._annotate_by_args(e, "this")}
244        for expr_type in {
245            exp.AddMonths,
246            exp.Ceil,
247            exp.DateTrunc,
248            exp.Floor,
249            exp.Left,
250            exp.Mode,
251            exp.Pad,
252            exp.Right,
253            exp.Round,
254            exp.Stuff,
255            exp.Substring,
256            exp.TimeSlice,
257            exp.TimestampTrunc,
258        }
259    },
260    **{
261        expr_type: {"returns": exp.DataType.Type.ARRAY}
262        for expr_type in (
263            exp.ApproxTopK,
264            exp.ApproxTopKEstimate,
265            exp.Array,
266            exp.ArrayAgg,
267            exp.ArrayAppend,
268            exp.ArrayConcat,
269            exp.ArrayConstructCompact,
270            exp.ArrayPrepend,
271            exp.ArrayRemove,
272            exp.ArrayUniqueAgg,
273            exp.ArrayUnionAgg,
274            exp.MapKeys,
275            exp.RegexpExtractAll,
276            exp.Split,
277            exp.StringToArray,
278        )
279    },
280    **{
281        expr_type: {"returns": exp.DataType.Type.BIGINT}
282        for expr_type in {
283            exp.BitmapBitPosition,
284            exp.BitmapBucketNumber,
285            exp.BitmapCount,
286            exp.Factorial,
287            exp.GroupingId,
288            exp.MD5NumberLower64,
289            exp.MD5NumberUpper64,
290            exp.Rand,
291            exp.Zipf,
292        }
293    },
294    **{
295        expr_type: {"returns": exp.DataType.Type.BINARY}
296        for expr_type in {
297            exp.Base64DecodeBinary,
298            exp.BitmapConstructAgg,
299            exp.BitmapOrAgg,
300            exp.Compress,
301            exp.DecompressBinary,
302            exp.Decrypt,
303            exp.DecryptRaw,
304            exp.Encrypt,
305            exp.EncryptRaw,
306            exp.HexString,
307            exp.MD5Digest,
308            exp.SHA1Digest,
309            exp.SHA2Digest,
310            exp.ToBinary,
311            exp.TryBase64DecodeBinary,
312            exp.TryHexDecodeBinary,
313            exp.Unhex,
314        }
315    },
316    **{
317        expr_type: {"returns": exp.DataType.Type.BOOLEAN}
318        for expr_type in {
319            exp.Booland,
320            exp.Boolnot,
321            exp.Boolor,
322            exp.BoolxorAgg,
323            exp.EqualNull,
324            exp.IsNullValue,
325            exp.MapContainsKey,
326            exp.Search,
327            exp.SearchIp,
328            exp.ToBoolean,
329        }
330    },
331    **{
332        expr_type: {"returns": exp.DataType.Type.DATE}
333        for expr_type in {
334            exp.NextDay,
335            exp.PreviousDay,
336        }
337    },
338    **{
339        expr_type: {
340            "annotator": lambda self, e: self._set_type(
341                e, exp.DataType.build("NUMBER", dialect="snowflake")
342            )
343        }
344        for expr_type in (
345            exp.BitwiseAndAgg,
346            exp.BitwiseOrAgg,
347            exp.BitwiseXorAgg,
348            exp.RegexpCount,
349            exp.RegexpInstr,
350            exp.ToNumber,
351        )
352    },
353    **{
354        expr_type: {"returns": exp.DataType.Type.DOUBLE}
355        for expr_type in {
356            exp.ApproxPercentileEstimate,
357            exp.ApproximateSimilarity,
358            exp.Asinh,
359            exp.Atanh,
360            exp.Cbrt,
361            exp.Cosh,
362            exp.CosineDistance,
363            exp.CovarPop,
364            exp.CovarSamp,
365            exp.DotProduct,
366            exp.EuclideanDistance,
367            exp.ManhattanDistance,
368            exp.MonthsBetween,
369            exp.Normal,
370            exp.Sinh,
371        }
372    },
373    exp.Kurtosis: {"annotator": _annotate_kurtosis},
374    **{
375        expr_type: {"returns": exp.DataType.Type.DECFLOAT}
376        for expr_type in {
377            exp.ToDecfloat,
378            exp.TryToDecfloat,
379        }
380    },
381    **{
382        expr_type: {"annotator": _annotate_math_with_float_decfloat}
383        for expr_type in {
384            exp.Acos,
385            exp.Asin,
386            exp.Atan,
387            exp.Atan2,
388            exp.Cos,
389            exp.Cot,
390            exp.Degrees,
391            exp.Exp,
392            exp.Ln,
393            exp.Log,
394            exp.Pow,
395            exp.Radians,
396            exp.RegrAvgx,
397            exp.RegrAvgy,
398            exp.RegrCount,
399            exp.RegrIntercept,
400            exp.RegrR2,
401            exp.RegrSlope,
402            exp.RegrSxx,
403            exp.RegrSxy,
404            exp.RegrSyy,
405            exp.RegrValx,
406            exp.RegrValy,
407            exp.Sin,
408            exp.Sqrt,
409            exp.Tan,
410            exp.Tanh,
411        }
412    },
413    **{
414        expr_type: {"returns": exp.DataType.Type.INT}
415        for expr_type in {
416            exp.Ascii,
417            exp.BitLength,
418            exp.ByteLength,
419            exp.Getbit,
420            exp.Grouping,
421            exp.Hour,
422            exp.JarowinklerSimilarity,
423            exp.Length,
424            exp.Levenshtein,
425            exp.MapSize,
426            exp.Minute,
427            exp.RtrimmedLength,
428            exp.Second,
429            exp.StrPosition,
430            exp.Unicode,
431            exp.WidthBucket,
432        }
433    },
434    **{
435        expr_type: {"returns": exp.DataType.Type.OBJECT}
436        for expr_type in {
437            exp.ApproxPercentileAccumulate,
438            exp.ApproxPercentileCombine,
439            exp.ApproxTopKAccumulate,
440            exp.ApproxTopKCombine,
441            exp.ObjectAgg,
442            exp.ParseIp,
443            exp.ParseUrl,
444            exp.XMLGet,
445        }
446    },
447    **{
448        expr_type: {"returns": exp.DataType.Type.MAP}
449        for expr_type in {
450            exp.MapCat,
451            exp.MapDelete,
452            exp.MapInsert,
453            exp.MapPick,
454        }
455    },
456    **{
457        expr_type: {"returns": exp.DataType.Type.FILE}
458        for expr_type in {
459            exp.ToFile,
460        }
461    },
462    **{
463        expr_type: {"returns": exp.DataType.Type.TIME}
464        for expr_type in {
465            exp.TimeFromParts,
466            exp.TsOrDsToTime,
467        }
468    },
469    **{
470        expr_type: {"returns": exp.DataType.Type.TIMESTAMPLTZ}
471        for expr_type in {
472            exp.CurrentTimestamp,
473            exp.Localtimestamp,
474        }
475    },
476    **{
477        expr_type: {"returns": exp.DataType.Type.VARCHAR}
478        for expr_type in {
479            exp.AIAgg,
480            exp.AIClassify,
481            exp.AISummarizeAgg,
482            exp.Base64DecodeString,
483            exp.Base64Encode,
484            exp.CheckJson,
485            exp.CheckXml,
486            exp.Chr,
487            exp.Collate,
488            exp.Collation,
489            exp.CurrentAccount,
490            exp.CurrentAccountName,
491            exp.CurrentAvailableRoles,
492            exp.CurrentClient,
493            exp.CurrentDatabase,
494            exp.CurrentIpAddress,
495            exp.CurrentSchemas,
496            exp.CurrentSecondaryRoles,
497            exp.CurrentSession,
498            exp.CurrentStatement,
499            exp.CurrentVersion,
500            exp.CurrentTransaction,
501            exp.CurrentWarehouse,
502            exp.CurrentOrganizationUser,
503            exp.CurrentRegion,
504            exp.CurrentRole,
505            exp.CurrentRoleType,
506            exp.CurrentOrganizationName,
507            exp.DecompressString,
508            exp.HexDecodeString,
509            exp.HexEncode,
510            exp.MD5,
511            exp.Monthname,
512            exp.Randstr,
513            exp.RegexpExtract,
514            exp.RegexpReplace,
515            exp.Repeat,
516            exp.Replace,
517            exp.SHA,
518            exp.SHA2,
519            exp.Soundex,
520            exp.SoundexP123,
521            exp.Space,
522            exp.SplitPart,
523            exp.Translate,
524            exp.TryBase64DecodeString,
525            exp.TryHexDecodeString,
526            exp.Uuid,
527        }
528    },
529    **{
530        expr_type: {"returns": exp.DataType.Type.VARIANT}
531        for expr_type in {
532            exp.Minhash,
533            exp.MinhashCombine,
534        }
535    },
536    **{
537        expr_type: {"annotator": _annotate_variance}
538        for expr_type in (
539            exp.Variance,
540            exp.VariancePop,
541        )
542    },
543    exp.ArgMax: {"annotator": _annotate_arg_max_min},
544    exp.ArgMin: {"annotator": _annotate_arg_max_min},
545    exp.ConcatWs: {"annotator": lambda self, e: self._annotate_by_args(e, "expressions")},
546    exp.ConvertTimezone: {
547        "annotator": lambda self, e: self._set_type(
548            e,
549            exp.DataType.Type.TIMESTAMPNTZ
550            if e.args.get("source_tz")
551            else exp.DataType.Type.TIMESTAMPTZ,
552        )
553    },
554    exp.DateAdd: {"annotator": _annotate_date_or_time_add},
555    exp.DecodeCase: {"annotator": _annotate_decode_case},
556    exp.HashAgg: {
557        "annotator": lambda self, e: self._set_type(
558            e, exp.DataType.build("NUMBER(19, 0)", dialect="snowflake")
559        )
560    },
561    exp.Median: {"annotator": _annotate_median},
562    exp.Reverse: {"annotator": _annotate_reverse},
563    exp.StrToTime: {"annotator": _annotate_str_to_time},
564    exp.TimeAdd: {"annotator": _annotate_date_or_time_add},
565    exp.TimestampFromParts: {"annotator": _annotate_timestamp_from_parts},
566    exp.WithinGroup: {"annotator": _annotate_within_group},
567}
DATE_PARTS = {'MONTH', 'YEAR', 'QUARTER', 'WEEK', 'DAY'}
MAX_PRECISION = 38
MAX_SCALE = 37
EXPRESSION_METADATA = {<class 'sqlglot.expressions.Add'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Adjacent'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.And'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayContains'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayContainsAll'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayOverlaps'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Binary'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseAnd'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseLeftShift'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseOr'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseRightShift'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseXor'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Collate'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Connector'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Corr'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DPipe'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Distance'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Div'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Dot'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.EQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Escape'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ExtendsLeft'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ExtendsRight'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.GT'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.GTE'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Glob'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ILike'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.IntDiv'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Is'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONArrayContains'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContains'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBExtract'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONBExtractScalar'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONExtract'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.JSONExtractScalar'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Kwarg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LT'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LTE'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Like'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Match'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Mod'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Mul'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NullSafeEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.NullSafeNEQ'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Operator'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Or'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Overlaps'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Pow'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.PropertyEQ'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.RegexpFullMatch'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpILike'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpLike'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.SimilarTo'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Sub'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Xor'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Alias'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseNot'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Neg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Not'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Paren'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.PivotAlias'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Unary'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ApproxDistinct'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixMicros'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Length'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.UnixSeconds'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixDate'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.CountIf'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.ArraySize'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Int64'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.UnixMillis'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.FromBase32'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.FromBase64'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.EndsWith'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Exists'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Any'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.StartsWith'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.In'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.LogicalAnd'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.LogicalOr'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Between'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.All'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Boolean'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Contains'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.DateFromParts'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.TimeStrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.TsOrDsToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.Date'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.CurrentDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.StrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.DateStrToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.LastDay'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.DiToDate'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.Datetime'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.DatetimeSub'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.DatetimeAdd'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.CurrentDatetime'>: {'returns': <Type.DATETIME: 'DATETIME'>}, <class 'sqlglot.expressions.Round'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.StddevSamp'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Stddev'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ApproxQuantile'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Skewness'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ToDouble'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Ln'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.VariancePop'>: {'annotator': <function _annotate_variance>}, <class 'sqlglot.expressions.Pi'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Radians'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Avg'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Exp'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.StddevPop'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Sqrt'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.SafeDivide'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Quantile'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Log'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Variance'>: {'annotator': <function _annotate_variance>}, <class 'sqlglot.expressions.Sign'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TimeDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Ceil'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Unicode'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DateToDi'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Ascii'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.StrPosition'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TsOrDiToDi'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Levenshtein'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.DatetimeDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.TimestampDiff'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.JustifyInterval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.JustifyHours'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.JustifyDays'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.Interval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.MakeInterval'>: {'returns': <Type.INTERVAL: 'INTERVAL'>}, <class 'sqlglot.expressions.ParseJSON'>: {'returns': <Type.JSON: 'JSON'>}, <class 'sqlglot.expressions.Localtime'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.CurrentTime'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimeSub'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimeAdd'>: {'annotator': <function _annotate_date_or_time_add>}, <class 'sqlglot.expressions.Time'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimestampLtzFromParts'>: {'returns': <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <class 'sqlglot.expressions.CurrentTimestampLTZ'>: {'returns': <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>}, <class 'sqlglot.expressions.TimestampTzFromParts'>: {'returns': <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>}, <class 'sqlglot.expressions.TimeStrToTime'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.TimestampSub'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.UnixToTime'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.StrToTime'>: {'annotator': <function _annotate_str_to_time>}, <class 'sqlglot.expressions.TimestampAdd'>: {'returns': <Type.TIMESTAMP: 'TIMESTAMP'>}, <class 'sqlglot.expressions.CurrentTimestamp'>: {'returns': <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <class 'sqlglot.expressions.Month'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.DayOfWeekIso'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Week'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Year'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.DayOfWeek'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.YearOfWeekIso'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Day'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.YearOfWeek'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.WeekOfYear'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.DayOfYear'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.Quarter'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.DayOfMonth'>: {'returns': <Type.TINYINT: 'TINYINT'>}, <class 'sqlglot.expressions.UnixToStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TimeToStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ToBase32'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Concat'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Lower'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TsOrDsToDateStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.GroupConcat'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Upper'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TimeToTimeStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ToBase64'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ConcatWs'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Chr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Initcap'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.String'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.UnixToTimeStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.RawString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Substring'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DateToDateStr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Trim'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ArrayToString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.ArrayReverse'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.SortArray'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Order'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.AnyValue'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Window'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Filter'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.LastValue'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.HavingMax'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Abs'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArraySlice'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Limit'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayConcatAgg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayConcat'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.Max'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Min'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Coalesce'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Greatest'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Least'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayFirst'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ArrayLast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Anonymous'>: {'returns': <Type.UNKNOWN: 'UNKNOWN'>}, <class 'sqlglot.expressions.Slice'>: {'returns': <Type.UNKNOWN: 'UNKNOWN'>}, <class 'sqlglot.expressions.DateSub'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.DateAdd'>: {'annotator': <function _annotate_date_or_time_add>}, <class 'sqlglot.expressions.DateTrunc'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Cast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.TryCast'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.VarMap'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Map'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Array'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayAgg'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.Bracket'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Case'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Count'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DateDiff'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DataType'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Distinct'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Explode'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Extract'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.HexString'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.GenerateSeries'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.GenerateDateArray'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.GenerateTimestampArray'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.If'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Literal'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Null'>: {'returns': <Type.NULL: 'NULL'>}, <class 'sqlglot.expressions.Nullif'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Struct'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Sum'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Timestamp'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.ToMap'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Unnest'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Subquery'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.TimestampTrunc'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Pad'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Mode'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Right'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Stuff'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Floor'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.Left'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.TimeSlice'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.AddMonths'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ApproxTopK'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ApproxTopKEstimate'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayAppend'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayConstructCompact'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayPrepend'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayRemove'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayUniqueAgg'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.ArrayUnionAgg'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.MapKeys'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.RegexpExtractAll'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.Split'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.StringToArray'>: {'returns': <Type.ARRAY: 'ARRAY'>}, <class 'sqlglot.expressions.BitmapCount'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.BitmapBucketNumber'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Factorial'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.MD5NumberUpper64'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.MD5NumberLower64'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.GroupingId'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Rand'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.BitmapBitPosition'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Zipf'>: {'returns': <Type.BIGINT: 'BIGINT'>}, <class 'sqlglot.expressions.Encrypt'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.DecryptRaw'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Base64DecodeBinary'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.DecompressBinary'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.ToBinary'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.SHA2Digest'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Compress'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.TryBase64DecodeBinary'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.SHA1Digest'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.TryHexDecodeBinary'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.BitmapOrAgg'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Unhex'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.BitmapConstructAgg'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.MD5Digest'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.EncryptRaw'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Decrypt'>: {'returns': <Type.BINARY: 'BINARY'>}, <class 'sqlglot.expressions.Search'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Boolor'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Booland'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.Boolnot'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.BoolxorAgg'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.ToBoolean'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.IsNullValue'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.MapContainsKey'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.SearchIp'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.EqualNull'>: {'returns': <Type.BOOLEAN: 'BOOLEAN'>}, <class 'sqlglot.expressions.NextDay'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.PreviousDay'>: {'returns': <Type.DATE: 'DATE'>}, <class 'sqlglot.expressions.BitwiseAndAgg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseOrAgg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.BitwiseXorAgg'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpCount'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.RegexpInstr'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ToNumber'>: {'annotator': <function <dictcomp>.<lambda>>}, <class 'sqlglot.expressions.ApproxPercentileEstimate'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.MonthsBetween'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ApproximateSimilarity'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.ManhattanDistance'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Atanh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.CovarPop'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cbrt'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.EuclideanDistance'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.CosineDistance'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.CovarSamp'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.DotProduct'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Normal'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Asinh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Cosh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Sinh'>: {'returns': <Type.DOUBLE: 'DOUBLE'>}, <class 'sqlglot.expressions.Kurtosis'>: {'annotator': <function _annotate_kurtosis>}, <class 'sqlglot.expressions.ToDecfloat'>: {'returns': <Type.DECFLOAT: 'DECFLOAT'>}, <class 'sqlglot.expressions.TryToDecfloat'>: {'returns': <Type.DECFLOAT: 'DECFLOAT'>}, <class 'sqlglot.expressions.RegrAvgx'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrValy'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Degrees'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrSlope'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Tan'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrSxy'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Sin'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrR2'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Atan2'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrCount'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Atan'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrAvgy'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Asin'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrValx'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Tanh'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Acos'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrSyy'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Cot'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.Cos'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrSxx'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.RegrIntercept'>: {'annotator': <function _annotate_math_with_float_decfloat>}, <class 'sqlglot.expressions.JarowinklerSimilarity'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.RtrimmedLength'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.MapSize'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.WidthBucket'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.ByteLength'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Second'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Getbit'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Minute'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Hour'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.Grouping'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.BitLength'>: {'returns': <Type.INT: 'INT'>}, <class 'sqlglot.expressions.ApproxTopKCombine'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ParseIp'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ApproxTopKAccumulate'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ApproxPercentileAccumulate'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ParseUrl'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ObjectAgg'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.ApproxPercentileCombine'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.XMLGet'>: {'returns': <Type.OBJECT: 'OBJECT'>}, <class 'sqlglot.expressions.MapInsert'>: {'returns': <Type.MAP: 'MAP'>}, <class 'sqlglot.expressions.MapDelete'>: {'returns': <Type.MAP: 'MAP'>}, <class 'sqlglot.expressions.MapPick'>: {'returns': <Type.MAP: 'MAP'>}, <class 'sqlglot.expressions.MapCat'>: {'returns': <Type.MAP: 'MAP'>}, <class 'sqlglot.expressions.ToFile'>: {'returns': <Type.FILE: 'FILE'>}, <class 'sqlglot.expressions.TsOrDsToTime'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.TimeFromParts'>: {'returns': <Type.TIME: 'TIME'>}, <class 'sqlglot.expressions.Localtimestamp'>: {'returns': <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <class 'sqlglot.expressions.CurrentAccountName'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Soundex'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Base64DecodeString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Replace'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentOrganizationUser'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Randstr'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentWarehouse'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentRole'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SHA'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentVersion'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentSession'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentSchemas'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.RegexpReplace'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TryHexDecodeString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Collation'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentIpAddress'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SplitPart'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.RegexpExtract'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.TryBase64DecodeString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Space'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.AISummarizeAgg'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentAvailableRoles'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SoundexP123'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Base64Encode'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Monthname'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CheckJson'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.HexDecodeString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentAccount'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Translate'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Repeat'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentRoleType'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.SHA2'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentTransaction'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.Uuid'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentRegion'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.MD5'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentStatement'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.DecompressString'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentSecondaryRoles'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentOrganizationName'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentDatabase'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.AIClassify'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CurrentClient'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.CheckXml'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.AIAgg'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.HexEncode'>: {'returns': <Type.VARCHAR: 'VARCHAR'>}, <class 'sqlglot.expressions.MinhashCombine'>: {'returns': <Type.VARIANT: 'VARIANT'>}, <class 'sqlglot.expressions.Minhash'>: {'returns': <Type.VARIANT: 'VARIANT'>}, <class 'sqlglot.expressions.ArgMax'>: {'annotator': <function _annotate_arg_max_min>}, <class 'sqlglot.expressions.ArgMin'>: {'annotator': <function _annotate_arg_max_min>}, <class 'sqlglot.expressions.ConvertTimezone'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.DecodeCase'>: {'annotator': <function _annotate_decode_case>}, <class 'sqlglot.expressions.HashAgg'>: {'annotator': <function <lambda>>}, <class 'sqlglot.expressions.Median'>: {'annotator': <function _annotate_median>}, <class 'sqlglot.expressions.Reverse'>: {'annotator': <function _annotate_reverse>}, <class 'sqlglot.expressions.TimestampFromParts'>: {'annotator': <function _annotate_timestamp_from_parts>}, <class 'sqlglot.expressions.WithinGroup'>: {'annotator': <function _annotate_within_group>}}