sqlglot.dialects.drill
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import exp, generator, parser, tokens, transforms 6from sqlglot.dialects.dialect import ( 7 Dialect, 8 datestrtodate_sql, 9 build_formatted_time, 10 no_trycast_sql, 11 rename_func, 12 str_position_sql, 13 timestrtotime_sql, 14) 15from sqlglot.transforms import preprocess, move_schema_columns_to_partitioned_by 16 17 18def _date_add_sql(kind: str) -> t.Callable[[Drill.Generator, exp.DateAdd | exp.DateSub], str]: 19 def func(self: Drill.Generator, expression: exp.DateAdd | exp.DateSub) -> str: 20 this = self.sql(expression, "this") 21 unit = exp.var(expression.text("unit").upper() or "DAY") 22 return self.func(f"DATE_{kind}", this, exp.Interval(this=expression.expression, unit=unit)) 23 24 return func 25 26 27def _str_to_date(self: Drill.Generator, expression: exp.StrToDate) -> str: 28 this = self.sql(expression, "this") 29 time_format = self.format_time(expression) 30 if time_format == Drill.DATE_FORMAT: 31 return self.sql(exp.cast(this, "date")) 32 return self.func("TO_DATE", this, time_format) 33 34 35class Drill(Dialect): 36 NORMALIZE_FUNCTIONS: bool | str = False 37 NULL_ORDERING = "nulls_are_last" 38 DATE_FORMAT = "'yyyy-MM-dd'" 39 DATEINT_FORMAT = "'yyyyMMdd'" 40 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 41 SUPPORTS_USER_DEFINED_TYPES = False 42 SUPPORTS_SEMI_ANTI_JOIN = False 43 TYPED_DIVISION = True 44 CONCAT_COALESCE = True 45 46 TIME_MAPPING = { 47 "y": "%Y", 48 "Y": "%Y", 49 "YYYY": "%Y", 50 "yyyy": "%Y", 51 "YY": "%y", 52 "yy": "%y", 53 "MMMM": "%B", 54 "MMM": "%b", 55 "MM": "%m", 56 "M": "%-m", 57 "dd": "%d", 58 "d": "%-d", 59 "HH": "%H", 60 "H": "%-H", 61 "hh": "%I", 62 "h": "%-I", 63 "mm": "%M", 64 "m": "%-M", 65 "ss": "%S", 66 "s": "%-S", 67 "SSSSSS": "%f", 68 "a": "%p", 69 "DD": "%j", 70 "D": "%-j", 71 "E": "%a", 72 "EE": "%a", 73 "EEE": "%a", 74 "EEEE": "%A", 75 "''T''": "T", 76 } 77 78 class Tokenizer(tokens.Tokenizer): 79 IDENTIFIERS = ["`"] 80 STRING_ESCAPES = ["\\"] 81 82 class Parser(parser.Parser): 83 STRICT_CAST = False 84 85 FUNCTIONS = { 86 **parser.Parser.FUNCTIONS, 87 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 88 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 89 } 90 91 LOG_DEFAULTS_TO_LN = True 92 93 class Generator(generator.Generator): 94 JOIN_HINTS = False 95 TABLE_HINTS = False 96 QUERY_HINTS = False 97 NVL2_SUPPORTED = False 98 LAST_DAY_SUPPORTS_DATE_PART = False 99 SUPPORTS_CREATE_TABLE_LIKE = False 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.ArraySize: rename_func("REPEATED_COUNT"), 125 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 126 exp.DateAdd: _date_add_sql("ADD"), 127 exp.DateStrToDate: datestrtodate_sql, 128 exp.DateSub: _date_add_sql("SUB"), 129 exp.DateToDi: lambda self, 130 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 131 exp.DiToDate: lambda self, 132 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 133 exp.If: lambda self, 134 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 135 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 136 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 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, "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 }
36class Drill(Dialect): 37 NORMALIZE_FUNCTIONS: bool | str = False 38 NULL_ORDERING = "nulls_are_last" 39 DATE_FORMAT = "'yyyy-MM-dd'" 40 DATEINT_FORMAT = "'yyyyMMdd'" 41 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 42 SUPPORTS_USER_DEFINED_TYPES = False 43 SUPPORTS_SEMI_ANTI_JOIN = False 44 TYPED_DIVISION = True 45 CONCAT_COALESCE = True 46 47 TIME_MAPPING = { 48 "y": "%Y", 49 "Y": "%Y", 50 "YYYY": "%Y", 51 "yyyy": "%Y", 52 "YY": "%y", 53 "yy": "%y", 54 "MMMM": "%B", 55 "MMM": "%b", 56 "MM": "%m", 57 "M": "%-m", 58 "dd": "%d", 59 "d": "%-d", 60 "HH": "%H", 61 "H": "%-H", 62 "hh": "%I", 63 "h": "%-I", 64 "mm": "%M", 65 "m": "%-M", 66 "ss": "%S", 67 "s": "%-S", 68 "SSSSSS": "%f", 69 "a": "%p", 70 "DD": "%j", 71 "D": "%-j", 72 "E": "%a", 73 "EE": "%a", 74 "EEE": "%a", 75 "EEEE": "%A", 76 "''T''": "T", 77 } 78 79 class Tokenizer(tokens.Tokenizer): 80 IDENTIFIERS = ["`"] 81 STRING_ESCAPES = ["\\"] 82 83 class Parser(parser.Parser): 84 STRICT_CAST = False 85 86 FUNCTIONS = { 87 **parser.Parser.FUNCTIONS, 88 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 89 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 90 } 91 92 LOG_DEFAULTS_TO_LN = True 93 94 class Generator(generator.Generator): 95 JOIN_HINTS = False 96 TABLE_HINTS = False 97 QUERY_HINTS = False 98 NVL2_SUPPORTED = False 99 LAST_DAY_SUPPORTS_DATE_PART = False 100 SUPPORTS_CREATE_TABLE_LIKE = False 101 102 TYPE_MAPPING = { 103 **generator.Generator.TYPE_MAPPING, 104 exp.DataType.Type.INT: "INTEGER", 105 exp.DataType.Type.SMALLINT: "INTEGER", 106 exp.DataType.Type.TINYINT: "INTEGER", 107 exp.DataType.Type.BINARY: "VARBINARY", 108 exp.DataType.Type.TEXT: "VARCHAR", 109 exp.DataType.Type.NCHAR: "VARCHAR", 110 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 111 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 112 exp.DataType.Type.DATETIME: "TIMESTAMP", 113 } 114 115 PROPERTIES_LOCATION = { 116 **generator.Generator.PROPERTIES_LOCATION, 117 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 118 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 119 } 120 121 TRANSFORMS = { 122 **generator.Generator.TRANSFORMS, 123 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 124 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 125 exp.ArraySize: rename_func("REPEATED_COUNT"), 126 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 127 exp.DateAdd: _date_add_sql("ADD"), 128 exp.DateStrToDate: datestrtodate_sql, 129 exp.DateSub: _date_add_sql("SUB"), 130 exp.DateToDi: lambda self, 131 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 132 exp.DiToDate: lambda self, 133 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 134 exp.If: lambda self, 135 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 136 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 137 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 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, "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.
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
- LOG_BASE_FIRST
- SAFE_DIVISION
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- get_or_raise
- format_time
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- parser
- generator
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
- KEYWORDS
- WHITE_SPACE
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- COMMENTS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
83 class Parser(parser.Parser): 84 STRICT_CAST = False 85 86 FUNCTIONS = { 87 **parser.Parser.FUNCTIONS, 88 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 89 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 90 } 91 92 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
- ID_VAR_TOKENS
- INTERVAL_VARS
- ALIAS_TOKENS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- FUNC_TOKENS
- CONJUNCTION
- 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
- 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
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- 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
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_UNION
- UNION_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- VALUES_FOLLOWED_BY_PAREN
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
94 class Generator(generator.Generator): 95 JOIN_HINTS = False 96 TABLE_HINTS = False 97 QUERY_HINTS = False 98 NVL2_SUPPORTED = False 99 LAST_DAY_SUPPORTS_DATE_PART = False 100 SUPPORTS_CREATE_TABLE_LIKE = False 101 102 TYPE_MAPPING = { 103 **generator.Generator.TYPE_MAPPING, 104 exp.DataType.Type.INT: "INTEGER", 105 exp.DataType.Type.SMALLINT: "INTEGER", 106 exp.DataType.Type.TINYINT: "INTEGER", 107 exp.DataType.Type.BINARY: "VARBINARY", 108 exp.DataType.Type.TEXT: "VARCHAR", 109 exp.DataType.Type.NCHAR: "VARCHAR", 110 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 111 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 112 exp.DataType.Type.DATETIME: "TIMESTAMP", 113 } 114 115 PROPERTIES_LOCATION = { 116 **generator.Generator.PROPERTIES_LOCATION, 117 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 118 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 119 } 120 121 TRANSFORMS = { 122 **generator.Generator.TRANSFORMS, 123 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 124 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 125 exp.ArraySize: rename_func("REPEATED_COUNT"), 126 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 127 exp.DateAdd: _date_add_sql("ADD"), 128 exp.DateStrToDate: datestrtodate_sql, 129 exp.DateSub: _date_add_sql("SUB"), 130 exp.DateToDi: lambda self, 131 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 132 exp.DiToDate: lambda self, 133 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 134 exp.If: lambda self, 135 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 136 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 137 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 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, "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
- EXPLICIT_UNION
- 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
- COLUMN_JOIN_MARKS_SUPPORTED
- 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
- STAR_MAPPING
- 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_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
- 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
- matchrecognize_sql
- query_modifiers
- 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_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
- currenttimestamp_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- altercolumn_sql
- renametable_sql
- renamecolumn_sql
- altertable_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
- log_sql
- use_sql
- binary
- function_fallback_sql
- func
- format_args
- text_width
- 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
- operator_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- arrayany_sql
- generateseries_sql
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql