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 16from sqlglot.generator import unsupported_args 17 18 19def _str_to_date(self: Drill.Generator, expression: exp.StrToDate) -> str: 20 this = self.sql(expression, "this") 21 time_format = self.format_time(expression) 22 if time_format == Drill.DATE_FORMAT: 23 return self.sql(exp.cast(this, exp.DataType.Type.DATE)) 24 return self.func("TO_DATE", this, time_format) 25 26 27class Drill(Dialect): 28 NORMALIZE_FUNCTIONS: bool | str = False 29 PRESERVE_ORIGINAL_NAMES = True 30 NULL_ORDERING = "nulls_are_last" 31 DATE_FORMAT = "'yyyy-MM-dd'" 32 DATEINT_FORMAT = "'yyyyMMdd'" 33 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 34 SUPPORTS_USER_DEFINED_TYPES = False 35 SUPPORTS_SEMI_ANTI_JOIN = False 36 TYPED_DIVISION = True 37 CONCAT_COALESCE = True 38 39 TIME_MAPPING = { 40 "y": "%Y", 41 "Y": "%Y", 42 "YYYY": "%Y", 43 "yyyy": "%Y", 44 "YY": "%y", 45 "yy": "%y", 46 "MMMM": "%B", 47 "MMM": "%b", 48 "MM": "%m", 49 "M": "%-m", 50 "dd": "%d", 51 "d": "%-d", 52 "HH": "%H", 53 "H": "%-H", 54 "hh": "%I", 55 "h": "%-I", 56 "mm": "%M", 57 "m": "%-M", 58 "ss": "%S", 59 "s": "%-S", 60 "SSSSSS": "%f", 61 "a": "%p", 62 "DD": "%j", 63 "D": "%-j", 64 "E": "%a", 65 "EE": "%a", 66 "EEE": "%a", 67 "EEEE": "%A", 68 "''T''": "T", 69 } 70 71 class Tokenizer(tokens.Tokenizer): 72 IDENTIFIERS = ["`"] 73 STRING_ESCAPES = ["\\"] 74 75 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 76 KEYWORDS.pop("/*+") 77 78 class Parser(parser.Parser): 79 STRICT_CAST = False 80 81 FUNCTIONS = { 82 **parser.Parser.FUNCTIONS, 83 "REPEATED_COUNT": exp.ArraySize.from_arg_list, 84 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 85 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 86 "LEVENSHTEIN_DISTANCE": exp.Levenshtein.from_arg_list, 87 } 88 89 LOG_DEFAULTS_TO_LN = True 90 91 class Generator(generator.Generator): 92 JOIN_HINTS = False 93 TABLE_HINTS = False 94 QUERY_HINTS = False 95 NVL2_SUPPORTED = False 96 LAST_DAY_SUPPORTS_DATE_PART = False 97 SUPPORTS_CREATE_TABLE_LIKE = False 98 ARRAY_SIZE_NAME = "REPEATED_COUNT" 99 100 TYPE_MAPPING = { 101 **generator.Generator.TYPE_MAPPING, 102 exp.DataType.Type.INT: "INTEGER", 103 exp.DataType.Type.SMALLINT: "INTEGER", 104 exp.DataType.Type.TINYINT: "INTEGER", 105 exp.DataType.Type.BINARY: "VARBINARY", 106 exp.DataType.Type.TEXT: "VARCHAR", 107 exp.DataType.Type.NCHAR: "VARCHAR", 108 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 109 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 110 exp.DataType.Type.DATETIME: "TIMESTAMP", 111 } 112 113 PROPERTIES_LOCATION = { 114 **generator.Generator.PROPERTIES_LOCATION, 115 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 116 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 117 } 118 119 TRANSFORMS = { 120 **generator.Generator.TRANSFORMS, 121 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 122 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 123 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 124 exp.DateAdd: date_add_sql("ADD"), 125 exp.DateStrToDate: datestrtodate_sql, 126 exp.DateSub: date_add_sql("SUB"), 127 exp.DateToDi: lambda self, 128 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 129 exp.DiToDate: lambda self, 130 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 131 exp.If: lambda self, 132 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 133 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 134 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 135 rename_func("LEVENSHTEIN_DISTANCE") 136 ), 137 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 138 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 139 exp.StrPosition: str_position_sql, 140 exp.StrToDate: _str_to_date, 141 exp.Pow: rename_func("POW"), 142 exp.Select: transforms.preprocess( 143 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 144 ), 145 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 146 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 147 exp.TimeStrToTime: timestrtotime_sql, 148 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 149 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 150 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 151 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 152 exp.TryCast: no_trycast_sql, 153 exp.TsOrDsAdd: lambda self, 154 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 155 exp.TsOrDiToDi: lambda self, 156 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 157 }
28class Drill(Dialect): 29 NORMALIZE_FUNCTIONS: bool | str = False 30 PRESERVE_ORIGINAL_NAMES = True 31 NULL_ORDERING = "nulls_are_last" 32 DATE_FORMAT = "'yyyy-MM-dd'" 33 DATEINT_FORMAT = "'yyyyMMdd'" 34 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 35 SUPPORTS_USER_DEFINED_TYPES = False 36 SUPPORTS_SEMI_ANTI_JOIN = False 37 TYPED_DIVISION = True 38 CONCAT_COALESCE = True 39 40 TIME_MAPPING = { 41 "y": "%Y", 42 "Y": "%Y", 43 "YYYY": "%Y", 44 "yyyy": "%Y", 45 "YY": "%y", 46 "yy": "%y", 47 "MMMM": "%B", 48 "MMM": "%b", 49 "MM": "%m", 50 "M": "%-m", 51 "dd": "%d", 52 "d": "%-d", 53 "HH": "%H", 54 "H": "%-H", 55 "hh": "%I", 56 "h": "%-I", 57 "mm": "%M", 58 "m": "%-M", 59 "ss": "%S", 60 "s": "%-S", 61 "SSSSSS": "%f", 62 "a": "%p", 63 "DD": "%j", 64 "D": "%-j", 65 "E": "%a", 66 "EE": "%a", 67 "EEE": "%a", 68 "EEEE": "%A", 69 "''T''": "T", 70 } 71 72 class Tokenizer(tokens.Tokenizer): 73 IDENTIFIERS = ["`"] 74 STRING_ESCAPES = ["\\"] 75 76 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 77 KEYWORDS.pop("/*+") 78 79 class Parser(parser.Parser): 80 STRICT_CAST = False 81 82 FUNCTIONS = { 83 **parser.Parser.FUNCTIONS, 84 "REPEATED_COUNT": exp.ArraySize.from_arg_list, 85 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 86 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 87 "LEVENSHTEIN_DISTANCE": exp.Levenshtein.from_arg_list, 88 } 89 90 LOG_DEFAULTS_TO_LN = True 91 92 class Generator(generator.Generator): 93 JOIN_HINTS = False 94 TABLE_HINTS = False 95 QUERY_HINTS = False 96 NVL2_SUPPORTED = False 97 LAST_DAY_SUPPORTS_DATE_PART = False 98 SUPPORTS_CREATE_TABLE_LIKE = False 99 ARRAY_SIZE_NAME = "REPEATED_COUNT" 100 101 TYPE_MAPPING = { 102 **generator.Generator.TYPE_MAPPING, 103 exp.DataType.Type.INT: "INTEGER", 104 exp.DataType.Type.SMALLINT: "INTEGER", 105 exp.DataType.Type.TINYINT: "INTEGER", 106 exp.DataType.Type.BINARY: "VARBINARY", 107 exp.DataType.Type.TEXT: "VARCHAR", 108 exp.DataType.Type.NCHAR: "VARCHAR", 109 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 110 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 111 exp.DataType.Type.DATETIME: "TIMESTAMP", 112 } 113 114 PROPERTIES_LOCATION = { 115 **generator.Generator.PROPERTIES_LOCATION, 116 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 117 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 118 } 119 120 TRANSFORMS = { 121 **generator.Generator.TRANSFORMS, 122 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 123 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 124 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 125 exp.DateAdd: date_add_sql("ADD"), 126 exp.DateStrToDate: datestrtodate_sql, 127 exp.DateSub: date_add_sql("SUB"), 128 exp.DateToDi: lambda self, 129 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 130 exp.DiToDate: lambda self, 131 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 132 exp.If: lambda self, 133 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 134 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 135 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 136 rename_func("LEVENSHTEIN_DISTANCE") 137 ), 138 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 139 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 140 exp.StrPosition: str_position_sql, 141 exp.StrToDate: _str_to_date, 142 exp.Pow: rename_func("POW"), 143 exp.Select: transforms.preprocess( 144 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 145 ), 146 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 147 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 148 exp.TimeStrToTime: timestrtotime_sql, 149 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 150 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 151 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 152 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 153 exp.TryCast: no_trycast_sql, 154 exp.TsOrDsAdd: lambda self, 155 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 156 exp.TsOrDiToDi: lambda self, 157 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 158 }
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.
Whether the name of the function should be preserved inside the node's metadata, can be useful for roundtripping deprecated vs new functions that share an AST node e.g JSON_VALUE vs JSON_EXTRACT_SCALAR in BigQuery
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
- STRICT_JSON_PATH_SYNTAX
- ON_CONDITION_EMPTY_BEFORE_ERROR
- ARRAY_AGG_INCLUDES_NULLS
- PROMOTE_TO_INFERRED_DATETIME_TYPE
- SUPPORTS_VALUES_DEFAULT
- REGEXP_EXTRACT_DEFAULT_GROUP
- SET_OP_DISTINCT_BY_DEFAULT
- 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
72 class Tokenizer(tokens.Tokenizer): 73 IDENTIFIERS = ["`"] 74 STRING_ESCAPES = ["\\"] 75 76 KEYWORDS = tokens.Tokenizer.KEYWORDS.copy() 77 KEYWORDS.pop("/*+")
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BIT_STRINGS
- BYTE_STRINGS
- HEX_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- QUOTES
- VAR_SINGLE_TOKENS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- HINT_START
- TOKENS_PRECEDING_HINT
- WHITE_SPACE
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- COMMENTS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
79 class Parser(parser.Parser): 80 STRICT_CAST = False 81 82 FUNCTIONS = { 83 **parser.Parser.FUNCTIONS, 84 "REPEATED_COUNT": exp.ArraySize.from_arg_list, 85 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 86 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 87 "LEVENSHTEIN_DISTANCE": exp.Levenshtein.from_arg_list, 88 } 89 90 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
- PROCEDURE_OPTIONS
- EXECUTE_AS_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
- IS_JSON_PREDICATE_KIND
- ODBC_DATETIME_LITERALS
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- DESCRIBE_STYLES
- OPERATION_MODIFIERS
- 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
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
92 class Generator(generator.Generator): 93 JOIN_HINTS = False 94 TABLE_HINTS = False 95 QUERY_HINTS = False 96 NVL2_SUPPORTED = False 97 LAST_DAY_SUPPORTS_DATE_PART = False 98 SUPPORTS_CREATE_TABLE_LIKE = False 99 ARRAY_SIZE_NAME = "REPEATED_COUNT" 100 101 TYPE_MAPPING = { 102 **generator.Generator.TYPE_MAPPING, 103 exp.DataType.Type.INT: "INTEGER", 104 exp.DataType.Type.SMALLINT: "INTEGER", 105 exp.DataType.Type.TINYINT: "INTEGER", 106 exp.DataType.Type.BINARY: "VARBINARY", 107 exp.DataType.Type.TEXT: "VARCHAR", 108 exp.DataType.Type.NCHAR: "VARCHAR", 109 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 110 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 111 exp.DataType.Type.DATETIME: "TIMESTAMP", 112 } 113 114 PROPERTIES_LOCATION = { 115 **generator.Generator.PROPERTIES_LOCATION, 116 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 117 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 118 } 119 120 TRANSFORMS = { 121 **generator.Generator.TRANSFORMS, 122 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 123 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 124 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 125 exp.DateAdd: date_add_sql("ADD"), 126 exp.DateStrToDate: datestrtodate_sql, 127 exp.DateSub: date_add_sql("SUB"), 128 exp.DateToDi: lambda self, 129 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 130 exp.DiToDate: lambda self, 131 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 132 exp.If: lambda self, 133 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 134 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 135 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 136 rename_func("LEVENSHTEIN_DISTANCE") 137 ), 138 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 139 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 140 exp.StrPosition: str_position_sql, 141 exp.StrToDate: _str_to_date, 142 exp.Pow: rename_func("POW"), 143 exp.Select: transforms.preprocess( 144 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 145 ), 146 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 147 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 148 exp.TimeStrToTime: timestrtotime_sql, 149 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 150 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 151 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 152 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 153 exp.TryCast: no_trycast_sql, 154 exp.TsOrDsAdd: lambda self, 155 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 156 exp.TsOrDiToDi: lambda self, 157 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 158 }
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
- EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE
- 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
- SUPPORTS_MEDIAN
- SUPPORTS_UNIX_SECONDS
- PARSE_JSON_NAME
- ARRAY_SIZE_DIM_REQUIRED
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- EXPRESSION_PRECEDES_PROPERTIES_CREATABLES
- 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
- set_operation
- set_operations
- 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
- 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
- groupingsets_sql
- rollup_sql
- cube_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
- 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
- alterrename_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
- duplicatekeyproperty_sql
- distributedbyproperty_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
- tsordstodatetime_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
- json_sql
- jsonvalue_sql
- conditionalinsert_sql
- multitableinserts_sql
- oncondition_sql
- jsonexists_sql
- arrayagg_sql
- apply_sql
- grant_sql
- grantprivilege_sql
- grantprincipal_sql
- columns_sql
- overlay_sql
- todouble_sql
- string_sql
- median_sql
- overflowtruncatebehavior_sql
- unixseconds_sql
- arraysize_sql
- attach_sql
- detach_sql
- attachoption_sql
- featuresattime_sql
- watermarkcolumnconstraint_sql
- encodeproperty_sql
- includeproperty_sql