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 class Parser(parser.Parser): 74 STRICT_CAST = False 75 76 FUNCTIONS = { 77 **parser.Parser.FUNCTIONS, 78 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 79 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 80 } 81 82 LOG_DEFAULTS_TO_LN = True 83 84 class Generator(generator.Generator): 85 JOIN_HINTS = False 86 TABLE_HINTS = False 87 QUERY_HINTS = False 88 NVL2_SUPPORTED = False 89 LAST_DAY_SUPPORTS_DATE_PART = False 90 SUPPORTS_CREATE_TABLE_LIKE = False 91 92 TYPE_MAPPING = { 93 **generator.Generator.TYPE_MAPPING, 94 exp.DataType.Type.INT: "INTEGER", 95 exp.DataType.Type.SMALLINT: "INTEGER", 96 exp.DataType.Type.TINYINT: "INTEGER", 97 exp.DataType.Type.BINARY: "VARBINARY", 98 exp.DataType.Type.TEXT: "VARCHAR", 99 exp.DataType.Type.NCHAR: "VARCHAR", 100 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 101 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 102 exp.DataType.Type.DATETIME: "TIMESTAMP", 103 } 104 105 PROPERTIES_LOCATION = { 106 **generator.Generator.PROPERTIES_LOCATION, 107 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 108 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 109 } 110 111 TRANSFORMS = { 112 **generator.Generator.TRANSFORMS, 113 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 114 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 115 exp.ArraySize: rename_func("REPEATED_COUNT"), 116 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 117 exp.DateAdd: date_add_sql("ADD"), 118 exp.DateStrToDate: datestrtodate_sql, 119 exp.DateSub: date_add_sql("SUB"), 120 exp.DateToDi: lambda self, 121 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 122 exp.DiToDate: lambda self, 123 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 124 exp.If: lambda self, 125 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 126 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 127 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 128 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 129 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 130 exp.StrPosition: str_position_sql, 131 exp.StrToDate: _str_to_date, 132 exp.Pow: rename_func("POW"), 133 exp.Select: transforms.preprocess( 134 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 135 ), 136 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 137 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 138 exp.TimeStrToTime: timestrtotime_sql, 139 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 140 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 141 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 142 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 143 exp.TryCast: no_trycast_sql, 144 exp.TsOrDsAdd: lambda self, 145 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 146 exp.TsOrDiToDi: lambda self, 147 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 148 }
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 class Parser(parser.Parser): 75 STRICT_CAST = False 76 77 FUNCTIONS = { 78 **parser.Parser.FUNCTIONS, 79 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 80 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 81 } 82 83 LOG_DEFAULTS_TO_LN = True 84 85 class Generator(generator.Generator): 86 JOIN_HINTS = False 87 TABLE_HINTS = False 88 QUERY_HINTS = False 89 NVL2_SUPPORTED = False 90 LAST_DAY_SUPPORTS_DATE_PART = False 91 SUPPORTS_CREATE_TABLE_LIKE = False 92 93 TYPE_MAPPING = { 94 **generator.Generator.TYPE_MAPPING, 95 exp.DataType.Type.INT: "INTEGER", 96 exp.DataType.Type.SMALLINT: "INTEGER", 97 exp.DataType.Type.TINYINT: "INTEGER", 98 exp.DataType.Type.BINARY: "VARBINARY", 99 exp.DataType.Type.TEXT: "VARCHAR", 100 exp.DataType.Type.NCHAR: "VARCHAR", 101 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 102 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 103 exp.DataType.Type.DATETIME: "TIMESTAMP", 104 } 105 106 PROPERTIES_LOCATION = { 107 **generator.Generator.PROPERTIES_LOCATION, 108 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 109 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 110 } 111 112 TRANSFORMS = { 113 **generator.Generator.TRANSFORMS, 114 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 115 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 116 exp.ArraySize: rename_func("REPEATED_COUNT"), 117 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 118 exp.DateAdd: date_add_sql("ADD"), 119 exp.DateStrToDate: datestrtodate_sql, 120 exp.DateSub: date_add_sql("SUB"), 121 exp.DateToDi: lambda self, 122 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 123 exp.DiToDate: lambda self, 124 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 125 exp.If: lambda self, 126 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 127 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 128 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 129 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 130 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 131 exp.StrPosition: str_position_sql, 132 exp.StrToDate: _str_to_date, 133 exp.Pow: rename_func("POW"), 134 exp.Select: transforms.preprocess( 135 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 136 ), 137 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 138 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 139 exp.TimeStrToTime: timestrtotime_sql, 140 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 141 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 142 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 143 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 144 exp.TryCast: no_trycast_sql, 145 exp.TsOrDsAdd: lambda self, 146 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 147 exp.TsOrDiToDi: lambda self, 148 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 149 }
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
- COPY_PARAMS_ARE_CSV
- 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
74 class Parser(parser.Parser): 75 STRICT_CAST = False 76 77 FUNCTIONS = { 78 **parser.Parser.FUNCTIONS, 79 "TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list, 80 "TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"), 81 } 82 83 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
- SUPPORTS_PARTITION_SELECTION
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
85 class Generator(generator.Generator): 86 JOIN_HINTS = False 87 TABLE_HINTS = False 88 QUERY_HINTS = False 89 NVL2_SUPPORTED = False 90 LAST_DAY_SUPPORTS_DATE_PART = False 91 SUPPORTS_CREATE_TABLE_LIKE = False 92 93 TYPE_MAPPING = { 94 **generator.Generator.TYPE_MAPPING, 95 exp.DataType.Type.INT: "INTEGER", 96 exp.DataType.Type.SMALLINT: "INTEGER", 97 exp.DataType.Type.TINYINT: "INTEGER", 98 exp.DataType.Type.BINARY: "VARBINARY", 99 exp.DataType.Type.TEXT: "VARCHAR", 100 exp.DataType.Type.NCHAR: "VARCHAR", 101 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 102 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 103 exp.DataType.Type.DATETIME: "TIMESTAMP", 104 } 105 106 PROPERTIES_LOCATION = { 107 **generator.Generator.PROPERTIES_LOCATION, 108 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 109 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 110 } 111 112 TRANSFORMS = { 113 **generator.Generator.TRANSFORMS, 114 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", 115 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), 116 exp.ArraySize: rename_func("REPEATED_COUNT"), 117 exp.Create: preprocess([move_schema_columns_to_partitioned_by]), 118 exp.DateAdd: date_add_sql("ADD"), 119 exp.DateStrToDate: datestrtodate_sql, 120 exp.DateSub: date_add_sql("SUB"), 121 exp.DateToDi: lambda self, 122 e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.DATEINT_FORMAT}) AS INT)", 123 exp.DiToDate: lambda self, 124 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})", 125 exp.If: lambda self, 126 e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", 127 exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"), 128 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), 129 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", 130 exp.RegexpLike: rename_func("REGEXP_MATCHES"), 131 exp.StrPosition: str_position_sql, 132 exp.StrToDate: _str_to_date, 133 exp.Pow: rename_func("POW"), 134 exp.Select: transforms.preprocess( 135 [transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins] 136 ), 137 exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)), 138 exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)), 139 exp.TimeStrToTime: timestrtotime_sql, 140 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 141 exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)), 142 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 143 exp.ToChar: lambda self, e: self.function_fallback_sql(e), 144 exp.TryCast: no_trycast_sql, 145 exp.TsOrDsAdd: lambda self, 146 e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.var('DAY')))})", 147 exp.TsOrDiToDi: lambda self, 148 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", 149 }
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
- OUTER_UNION_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- 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_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
- 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
- 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
- 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
- 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
- operator_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- generateseries_sql
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql