sqlglot.dialects.drill
1from __future__ import annotations 2 3 4from sqlglot import exp, generator, parser, tokens, transforms 5from sqlglot.dialects.dialect import ( 6 Dialect, 7 datestrtodate_sql, 8 build_formatted_time, 9 no_trycast_sql, 10 rename_func, 11 str_position_sql, 12 timestrtotime_sql, 13) 14from sqlglot.dialects.mysql import date_add_sql 15from sqlglot.transforms import preprocess, move_schema_columns_to_partitioned_by 16 17 18def _str_to_date(self: Drill.Generator, expression: exp.StrToDate) -> str: 19 this = self.sql(expression, "this") 20 time_format = self.format_time(expression) 21 if time_format == Drill.DATE_FORMAT: 22 return self.sql(exp.cast(this, exp.DataType.Type.DATE)) 23 return self.func("TO_DATE", this, time_format) 24 25 26class Drill(Dialect): 27 NORMALIZE_FUNCTIONS: bool | str = False 28 NULL_ORDERING = "nulls_are_last" 29 DATE_FORMAT = "'yyyy-MM-dd'" 30 DATEINT_FORMAT = "'yyyyMMdd'" 31 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 32 SUPPORTS_USER_DEFINED_TYPES = False 33 SUPPORTS_SEMI_ANTI_JOIN = False 34 TYPED_DIVISION = True 35 CONCAT_COALESCE = True 36 37 TIME_MAPPING = { 38 "y": "%Y", 39 "Y": "%Y", 40 "YYYY": "%Y", 41 "yyyy": "%Y", 42 "YY": "%y", 43 "yy": "%y", 44 "MMMM": "%B", 45 "MMM": "%b", 46 "MM": "%m", 47 "M": "%-m", 48 "dd": "%d", 49 "d": "%-d", 50 "HH": "%H", 51 "H": "%-H", 52 "hh": "%I", 53 "h": "%-I", 54 "mm": "%M", 55 "m": "%-M", 56 "ss": "%S", 57 "s": "%-S", 58 "SSSSSS": "%f", 59 "a": "%p", 60 "DD": "%j", 61 "D": "%-j", 62 "E": "%a", 63 "EE": "%a", 64 "EEE": "%a", 65 "EEEE": "%A", 66 "''T''": "T", 67 } 68 69 class Tokenizer(tokens.Tokenizer): 70 IDENTIFIERS = ["`"] 71 STRING_ESCAPES = ["\\"] 72 73 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 74 KEYWORDS.pop("/*+") 75 76 class Parser(parser.Parser): 77 STRICT_CAST = False 78 79 FUNCTIONS = { 80 **parser.Parser.FUNCTIONS, 81 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 82 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 83 } 84 85 LOG_DEFAULTS_TO_LN = True 86 87 class Generator(generator.Generator): 88 JOIN_HINTS = False 89 TABLE_HINTS = False 90 QUERY_HINTS = False 91 NVL2_SUPPORTED = False 92 LAST_DAY_SUPPORTS_DATE_PART = False 93 SUPPORTS_CREATE_TABLE_LIKE = False 94 95 TYPE_MAPPING = { 96 **generator.Generator.TYPE_MAPPING, 97 exp.DataType.Type.INT: "INTEGER", 98 exp.DataType.Type.SMALLINT: "INTEGER", 99 exp.DataType.Type.TINYINT: "INTEGER", 100 exp.DataType.Type.BINARY: "VARBINARY", 101 exp.DataType.Type.TEXT: "VARCHAR", 102 exp.DataType.Type.NCHAR: "VARCHAR", 103 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 104 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 105 exp.DataType.Type.DATETIME: "TIMESTAMP", 106 } 107 108 PROPERTIES_LOCATION = { 109 **generator.Generator.PROPERTIES_LOCATION, 110 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 111 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 112 } 113 114 TRANSFORMS = { 115 **generator.Generator.TRANSFORMS, 116 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 117 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 118 exp.ArraySize: rename_func("REPEATED_COUNT"), 119 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 120 exp.DateAdd: date_add_sql("ADD"), 121 exp.DateStrToDate: datestrtodate_sql, 122 exp.DateSub: date_add_sql("SUB"), 123 exp.DateToDi: lambda self, 124 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 125 exp.DiToDate: lambda self, 126 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 127 exp.If: lambda self, 128 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 129 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 130 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 131 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 132 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 133 exp.StrPosition: str_position_sql, 134 exp.StrToDate: _str_to_date, 135 exp.Pow: rename_func("POW"), 136 exp.Select: transforms.preprocess( 137 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 138 ), 139 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 140 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 141 exp.TimeStrToTime: timestrtotime_sql, 142 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 143 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 144 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 145 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 146 exp.TryCast: no_trycast_sql, 147 exp.TsOrDsAdd: lambda self, 148 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 149 exp.TsOrDiToDi: lambda self, 150 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 151 }
27class Drill(Dialect): 28 NORMALIZE_FUNCTIONS: bool | str = False 29 NULL_ORDERING = "nulls_are_last" 30 DATE_FORMAT = "'yyyy-MM-dd'" 31 DATEINT_FORMAT = "'yyyyMMdd'" 32 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 33 SUPPORTS_USER_DEFINED_TYPES = False 34 SUPPORTS_SEMI_ANTI_JOIN = False 35 TYPED_DIVISION = True 36 CONCAT_COALESCE = True 37 38 TIME_MAPPING = { 39 "y": "%Y", 40 "Y": "%Y", 41 "YYYY": "%Y", 42 "yyyy": "%Y", 43 "YY": "%y", 44 "yy": "%y", 45 "MMMM": "%B", 46 "MMM": "%b", 47 "MM": "%m", 48 "M": "%-m", 49 "dd": "%d", 50 "d": "%-d", 51 "HH": "%H", 52 "H": "%-H", 53 "hh": "%I", 54 "h": "%-I", 55 "mm": "%M", 56 "m": "%-M", 57 "ss": "%S", 58 "s": "%-S", 59 "SSSSSS": "%f", 60 "a": "%p", 61 "DD": "%j", 62 "D": "%-j", 63 "E": "%a", 64 "EE": "%a", 65 "EEE": "%a", 66 "EEEE": "%A", 67 "''T''": "T", 68 } 69 70 class Tokenizer(tokens.Tokenizer): 71 IDENTIFIERS = ["`"] 72 STRING_ESCAPES = ["\\"] 73 74 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 75 KEYWORDS.pop("/*+") 76 77 class Parser(parser.Parser): 78 STRICT_CAST = False 79 80 FUNCTIONS = { 81 **parser.Parser.FUNCTIONS, 82 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 83 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 84 } 85 86 LOG_DEFAULTS_TO_LN = True 87 88 class Generator(generator.Generator): 89 JOIN_HINTS = False 90 TABLE_HINTS = False 91 QUERY_HINTS = False 92 NVL2_SUPPORTED = False 93 LAST_DAY_SUPPORTS_DATE_PART = False 94 SUPPORTS_CREATE_TABLE_LIKE = False 95 96 TYPE_MAPPING = { 97 **generator.Generator.TYPE_MAPPING, 98 exp.DataType.Type.INT: "INTEGER", 99 exp.DataType.Type.SMALLINT: "INTEGER", 100 exp.DataType.Type.TINYINT: "INTEGER", 101 exp.DataType.Type.BINARY: "VARBINARY", 102 exp.DataType.Type.TEXT: "VARCHAR", 103 exp.DataType.Type.NCHAR: "VARCHAR", 104 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 105 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 106 exp.DataType.Type.DATETIME: "TIMESTAMP", 107 } 108 109 PROPERTIES_LOCATION = { 110 **generator.Generator.PROPERTIES_LOCATION, 111 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 112 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 113 } 114 115 TRANSFORMS = { 116 **generator.Generator.TRANSFORMS, 117 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 118 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 119 exp.ArraySize: rename_func("REPEATED_COUNT"), 120 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 121 exp.DateAdd: date_add_sql("ADD"), 122 exp.DateStrToDate: datestrtodate_sql, 123 exp.DateSub: date_add_sql("SUB"), 124 exp.DateToDi: lambda self, 125 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 126 exp.DiToDate: lambda self, 127 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 128 exp.If: lambda self, 129 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 130 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 131 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 132 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 133 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 134 exp.StrPosition: str_position_sql, 135 exp.StrToDate: _str_to_date, 136 exp.Pow: rename_func("POW"), 137 exp.Select: transforms.preprocess( 138 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 139 ), 140 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 141 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 142 exp.TimeStrToTime: timestrtotime_sql, 143 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 144 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 145 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 146 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 147 exp.TryCast: no_trycast_sql, 148 exp.TsOrDsAdd: lambda self, 149 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 150 exp.TsOrDiToDi: lambda self, 151 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 152 }
Determines how function names are going to be normalized.
Possible values:
"upper" or True: Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
Default NULL
ordering method to use if not explicitly set.
Possible values: "nulls_are_small"
, "nulls_are_large"
, "nulls_are_last"
Whether the behavior of a / b
depends on the types of a
and b
.
False means a / b
is always float division.
True means a / b
is integer division if both a
and b
are integers.
A NULL
arg in CONCAT
yields NULL
by default, but in some dialects it yields an empty string.
Associates this dialect's time formats with their equivalent Python strftime
formats.
Mapping of an escaped sequence (\n
) to its unescaped version (
).
Inherited Members
- sqlglot.dialects.dialect.Dialect
- Dialect
- INDEX_OFFSET
- WEEK_OFFSET
- UNNEST_COLUMN_ONLY
- ALIAS_POST_TABLESAMPLE
- TABLESAMPLE_SIZE_IS_PERCENT
- NORMALIZATION_STRATEGY
- IDENTIFIERS_CAN_START_WITH_DIGIT
- DPIPE_IS_STRING_CONCAT
- STRICT_STRING_CONCAT
- COPY_PARAMS_ARE_CSV
- LOG_BASE_FIRST
- SAFE_DIVISION
- HEX_LOWERCASE
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- FORCE_EARLY_ALIAS_REF_EXPANSION
- EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BY
- SUPPORTS_ORDER_BY_ALL
- HAS_DISTINCT_ARRAY_CONSTRUCTORS
- SUPPORTS_FIXED_SIZE_ARRAYS
- CREATABLE_KIND_MAPPING
- DATE_PART_MAPPING
- TYPE_TO_EXPRESSIONS
- ANNOTATORS
- get_or_raise
- format_time
- settings
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- jsonpath_tokenizer
- parser
- generator
70 class Tokenizer(tokens.Tokenizer): 71 IDENTIFIERS = ["`"] 72 STRING_ESCAPES = ["\\"] 73 74 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 75 KEYWORDS.pop("/*+")
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BIT_STRINGS
- BYTE_STRINGS
- HEX_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- IDENTIFIER_ESCAPES
- QUOTES
- VAR_SINGLE_TOKENS
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- WHITE_SPACE
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- COMMENTS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
77 class Parser(parser.Parser): 78 STRICT_CAST = False 79 80 FUNCTIONS = { 81 **parser.Parser.FUNCTIONS, 82 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 83 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 84 } 85 86 LOG_DEFAULTS_TO_LN = True
Parser consumes a list of tokens produced by the Tokenizer and produces a parsed syntax tree.
Arguments:
- error_level: The desired error level. Default: ErrorLevel.IMMEDIATE
- error_message_context: The amount of context to capture from a query string when displaying the error message (in number of characters). Default: 100
- max_errors: Maximum number of error messages to include in a raised ParseError. This is only relevant if error_level is ErrorLevel.RAISE. Default: 3
Inherited Members
- sqlglot.parser.Parser
- Parser
- NO_PAREN_FUNCTIONS
- STRUCT_TYPE_TOKENS
- NESTED_TYPE_TOKENS
- ENUM_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- RESERVED_TOKENS
- DB_CREATABLES
- CREATABLES
- ALTERABLES
- INTERVAL_VARS
- ALIAS_TOKENS
- ARRAY_CONSTRUCTORS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- FUNC_TOKENS
- CONJUNCTION
- ASSIGNMENT
- DISJUNCTION
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- LAMBDAS
- COLUMN_OPERATORS
- EXPRESSION_PARSERS
- STATEMENT_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- RANGE_PARSERS
- PROPERTY_PARSERS
- CONSTRAINT_PARSERS
- ALTER_PARSERS
- ALTER_ALTER_PARSERS
- SCHEMA_UNNAMED_CONSTRAINTS
- NO_PAREN_FUNCTION_PARSERS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- FUNCTION_PARSERS
- QUERY_MODIFIER_PARSERS
- SET_PARSERS
- SHOW_PARSERS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- NULL_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- VALUES_FOLLOWED_BY_PAREN
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- SUPPORTS_PARTITION_SELECTION
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
88 class Generator(generator.Generator): 89 JOIN_HINTS = False 90 TABLE_HINTS = False 91 QUERY_HINTS = False 92 NVL2_SUPPORTED = False 93 LAST_DAY_SUPPORTS_DATE_PART = False 94 SUPPORTS_CREATE_TABLE_LIKE = False 95 96 TYPE_MAPPING = { 97 **generator.Generator.TYPE_MAPPING, 98 exp.DataType.Type.INT: "INTEGER", 99 exp.DataType.Type.SMALLINT: "INTEGER", 100 exp.DataType.Type.TINYINT: "INTEGER", 101 exp.DataType.Type.BINARY: "VARBINARY", 102 exp.DataType.Type.TEXT: "VARCHAR", 103 exp.DataType.Type.NCHAR: "VARCHAR", 104 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 105 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 106 exp.DataType.Type.DATETIME: "TIMESTAMP", 107 } 108 109 PROPERTIES_LOCATION = { 110 **generator.Generator.PROPERTIES_LOCATION, 111 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 112 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 113 } 114 115 TRANSFORMS = { 116 **generator.Generator.TRANSFORMS, 117 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 118 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 119 exp.ArraySize: rename_func("REPEATED_COUNT"), 120 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 121 exp.DateAdd: date_add_sql("ADD"), 122 exp.DateStrToDate: datestrtodate_sql, 123 exp.DateSub: date_add_sql("SUB"), 124 exp.DateToDi: lambda self, 125 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 126 exp.DiToDate: lambda self, 127 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 128 exp.If: lambda self, 129 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 130 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 131 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 132 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 133 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 134 exp.StrPosition: str_position_sql, 135 exp.StrToDate: _str_to_date, 136 exp.Pow: rename_func("POW"), 137 exp.Select: transforms.preprocess( 138 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 139 ), 140 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 141 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 142 exp.TimeStrToTime: timestrtotime_sql, 143 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 144 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 145 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 146 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 147 exp.TryCast: no_trycast_sql, 148 exp.TsOrDsAdd: lambda self, 149 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 150 exp.TsOrDiToDi: lambda self, 151 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 152 }
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
Inherited Members
- sqlglot.generator.Generator
- Generator
- NULL_ORDERING_SUPPORTED
- IGNORE_NULLS_IN_FUNC
- LOCKING_READS_SUPPORTED
- EXPLICIT_SET_OP
- WRAP_DERIVED_VALUES
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SINGLE_STRING_INTERVAL
- INTERVAL_ALLOWS_PLURAL_FORM
- LIMIT_FETCH
- LIMIT_ONLY_LITERALS
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- INDEX_ON
- QUERY_HINT_SEP
- IS_BOOL_ALLOWED
- DUPLICATE_KEY_UPDATE_WITH_SET
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- VALUES_AS_TABLE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- AGGREGATE_FILTER_SUPPORTED
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- JSON_KEY_VALUE_PAIR_SEP
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_TYPE_REQUIRED_FOR_EXTRACTION
- JSON_PATH_BRACKETED_KEY_SUPPORTED
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- SUPPORTED_JSON_PATH_PARTS
- CAN_IMPLEMENT_ARRAY_ANY
- SUPPORTS_TO_NUMBER
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- QUOTE_JSON_PATH
- PAD_FILL_PATTERN_IS_REQUIRED
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- PARSE_JSON_NAME
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- RESERVED_KEYWORDS
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- pad_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- datatype_sql
- directory_sql
- delete_sql
- drop_sql
- except_sql
- except_op
- fetch_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- intersect_sql
- intersect_op
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- group_sql
- having_sql
- connect_sql
- prior_sql
- join_sql
- lambda_sql
- lateral_op
- lateral_sql
- limit_sql
- offset_sql
- setitem_sql
- set_sql
- pragma_sql
- lock_sql
- literal_sql
- escape_str
- loaddata_sql
- null_sql
- boolean_sql
- order_sql
- withfill_sql
- cluster_sql
- distribute_sql
- sort_sql
- ordered_sql
- matchrecognizemeasure_sql
- matchrecognize_sql
- query_modifiers
- options_modifier
- queryoption_sql
- offset_limit_modifiers
- after_limit_modifiers
- select_sql
- schema_sql
- schema_columns_sql
- star_sql
- parameter_sql
- sessionparameter_sql
- placeholder_sql
- subquery_sql
- qualify_sql
- set_operations
- union_sql
- union_op
- unnest_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- exists_sql
- case_sql
- constraint_sql
- nextvaluefor_sql
- extract_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- jsonobject_sql
- jsonobjectagg_sql
- jsonarray_sql
- jsonarrayagg_sql
- jsoncolumndef_sql
- jsonschema_sql
- jsontable_sql
- openjsoncolumndef_sql
- openjson_sql
- in_sql
- in_unnest_op
- interval_sql
- return_sql
- reference_sql
- anonymous_sql
- paren_sql
- neg_sql
- not_sql
- alias_sql
- pivotalias_sql
- aliases_sql
- atindex_sql
- attimezone_sql
- fromtimezone_sql
- add_sql
- and_sql
- or_sql
- xor_sql
- connector_sql
- bitwiseand_sql
- bitwiseleftshift_sql
- bitwisenot_sql
- bitwiseor_sql
- bitwiserightshift_sql
- bitwisexor_sql
- cast_sql
- currentdate_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- altercolumn_sql
- alterdiststyle_sql
- altersortkey_sql
- renametable_sql
- renamecolumn_sql
- alterset_sql
- alter_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- dpipe_sql
- div_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- ilike_sql
- ilikeany_sql
- is_sql
- like_sql
- likeany_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- try_sql
- log_sql
- use_sql
- binary
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- joinhint_sql
- kwarg_sql
- when_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- comprehension_sql
- columnprefix_sql
- opclass_sql
- predict_sql
- forin_sql
- refresh_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql
- scope_resolution
- scoperesolution_sql
- parsejson_sql
- rand_sql
- changes_sql
- pad_sql
- summarize_sql
- explodinggenerateseries_sql
- arrayconcat_sql
- converttimezone_sql