sqlglot.dialects.hive
1from __future__ import annotations 2 3from copy import deepcopy 4from collections import defaultdict 5 6from sqlglot import exp, jsonpath, tokens 7from sqlglot.dialects.dialect import ( 8 Dialect, 9 NormalizationStrategy, 10) 11from sqlglot.generators.hive import HiveGenerator 12from sqlglot.parsers.hive import HiveParser 13from sqlglot.tokens import TokenType 14from sqlglot.optimizer.annotate_types import TypeAnnotator 15from sqlglot.typing.hive import EXPRESSION_METADATA 16 17 18class Hive(Dialect): 19 ALIAS_POST_TABLESAMPLE = True 20 IDENTIFIERS_CAN_START_WITH_DIGIT = True 21 SUPPORTS_USER_DEFINED_TYPES = False 22 SAFE_DIVISION = True 23 CONCAT_WS_COALESCE = True 24 ARRAY_AGG_INCLUDES_NULLS = None 25 REGEXP_EXTRACT_DEFAULT_GROUP = 1 26 ALTER_TABLE_SUPPORTS_CASCADE = True 27 INTERSECT_BINDS_TIGHTER_THAN_UNION_AND_EXCEPT = False 28 29 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 30 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 31 32 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 33 34 # https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362046#LanguageManualUDF-StringFunctions 35 # https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java#L266-L269 36 INITCAP_DEFAULT_DELIMITER_CHARS = " \t\n\r\f\u000b\u001c\u001d\u001e\u001f" 37 38 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 39 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 40 for target_type in { 41 *exp.DataType.NUMERIC_TYPES, 42 *exp.DataType.TEMPORAL_TYPES, 43 exp.DType.INTERVAL, 44 }: 45 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 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 # Hive 4.0+ parses MM/dd/HH/hh/mm/ss strictly (java.time.DateTimeFormatter, see 57 # HIVE-25458/HIVE-25576) 58 "MM": "%mstrict", 59 "M": "%-m", 60 "dd": "%dstrict", 61 "d": "%-d", 62 "HH": "%Hstrict", 63 "H": "%-H", 64 "hh": "%Istrict", 65 "h": "%-I", 66 "mm": "%Mstrict", 67 "m": "%-M", 68 "ss": "%Sstrict", 69 "s": "%-S", 70 "SSSSSS": "%f", 71 "a": "%p", 72 "DD": "%j", 73 "D": "%-j", 74 "E": "%a", 75 "EE": "%a", 76 "EEE": "%a", 77 "EEEE": "%A", 78 "z": "%Z", 79 "Z": "%z", 80 } 81 82 DATE_FORMAT = "'yyyy-MM-dd'" 83 DATEINT_FORMAT = "'yyyyMMdd'" 84 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 85 86 class JSONPathTokenizer(jsonpath.JSONPathTokenizer): 87 VAR_TOKENS = { 88 *jsonpath.JSONPathTokenizer.VAR_TOKENS, 89 TokenType.DASH, 90 } 91 92 UNESCAPED_SEQUENCES = { 93 "\\0": "\0", 94 "\\Z": "\x1a", 95 "\\%": "\\%", 96 "\\_": "\\_", 97 "\\a": "a", 98 "\\f": "f", 99 "\\v": "v", 100 } 101 102 class Tokenizer(tokens.Tokenizer): 103 NUMERIC_ESCAPES = {"u": (16, 4, 4, 0xFFFF), "0": (8, 3, 3, 0x7F)} 104 DROP_UNKNOWN_ESCAPES = True 105 LONE_SURROGATE_REPLACEMENT = "?" 106 QUOTES = ["'", '"'] 107 IDENTIFIERS = ["`"] 108 STRING_ESCAPES = ["\\"] 109 110 SINGLE_TOKENS = { 111 **tokens.Tokenizer.SINGLE_TOKENS, 112 "$": TokenType.PARAMETER, 113 } 114 115 KEYWORDS = { 116 **tokens.Tokenizer.KEYWORDS, 117 "ADD ARCHIVE": TokenType.COMMAND, 118 "ADD ARCHIVES": TokenType.COMMAND, 119 "ADD FILE": TokenType.COMMAND, 120 "ADD FILES": TokenType.COMMAND, 121 "ADD JAR": TokenType.COMMAND, 122 "ADD JARS": TokenType.COMMAND, 123 "MINUS": TokenType.EXCEPT, 124 "MSCK REPAIR": TokenType.COMMAND, 125 "REFRESH": TokenType.REFRESH, 126 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 127 } 128 129 NUMERIC_LITERALS = { 130 "L": "BIGINT", 131 "S": "SMALLINT", 132 "Y": "TINYINT", 133 "D": "DOUBLE", 134 "F": "FLOAT", 135 "BD": "DECIMAL", 136 } 137 138 Parser = HiveParser 139 140 Generator = HiveGenerator
19class Hive(Dialect): 20 ALIAS_POST_TABLESAMPLE = True 21 IDENTIFIERS_CAN_START_WITH_DIGIT = True 22 SUPPORTS_USER_DEFINED_TYPES = False 23 SAFE_DIVISION = True 24 CONCAT_WS_COALESCE = True 25 ARRAY_AGG_INCLUDES_NULLS = None 26 REGEXP_EXTRACT_DEFAULT_GROUP = 1 27 ALTER_TABLE_SUPPORTS_CASCADE = True 28 INTERSECT_BINDS_TIGHTER_THAN_UNION_AND_EXCEPT = False 29 30 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 31 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 32 33 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 34 35 # https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362046#LanguageManualUDF-StringFunctions 36 # https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java#L266-L269 37 INITCAP_DEFAULT_DELIMITER_CHARS = " \t\n\r\f\u000b\u001c\u001d\u001e\u001f" 38 39 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 40 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 41 for target_type in { 42 *exp.DataType.NUMERIC_TYPES, 43 *exp.DataType.TEMPORAL_TYPES, 44 exp.DType.INTERVAL, 45 }: 46 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 47 48 TIME_MAPPING = { 49 "y": "%Y", 50 "Y": "%Y", 51 "YYYY": "%Y", 52 "yyyy": "%Y", 53 "YY": "%y", 54 "yy": "%y", 55 "MMMM": "%B", 56 "MMM": "%b", 57 # Hive 4.0+ parses MM/dd/HH/hh/mm/ss strictly (java.time.DateTimeFormatter, see 58 # HIVE-25458/HIVE-25576) 59 "MM": "%mstrict", 60 "M": "%-m", 61 "dd": "%dstrict", 62 "d": "%-d", 63 "HH": "%Hstrict", 64 "H": "%-H", 65 "hh": "%Istrict", 66 "h": "%-I", 67 "mm": "%Mstrict", 68 "m": "%-M", 69 "ss": "%Sstrict", 70 "s": "%-S", 71 "SSSSSS": "%f", 72 "a": "%p", 73 "DD": "%j", 74 "D": "%-j", 75 "E": "%a", 76 "EE": "%a", 77 "EEE": "%a", 78 "EEEE": "%A", 79 "z": "%Z", 80 "Z": "%z", 81 } 82 83 DATE_FORMAT = "'yyyy-MM-dd'" 84 DATEINT_FORMAT = "'yyyyMMdd'" 85 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 86 87 class JSONPathTokenizer(jsonpath.JSONPathTokenizer): 88 VAR_TOKENS = { 89 *jsonpath.JSONPathTokenizer.VAR_TOKENS, 90 TokenType.DASH, 91 } 92 93 UNESCAPED_SEQUENCES = { 94 "\\0": "\0", 95 "\\Z": "\x1a", 96 "\\%": "\\%", 97 "\\_": "\\_", 98 "\\a": "a", 99 "\\f": "f", 100 "\\v": "v", 101 } 102 103 class Tokenizer(tokens.Tokenizer): 104 NUMERIC_ESCAPES = {"u": (16, 4, 4, 0xFFFF), "0": (8, 3, 3, 0x7F)} 105 DROP_UNKNOWN_ESCAPES = True 106 LONE_SURROGATE_REPLACEMENT = "?" 107 QUOTES = ["'", '"'] 108 IDENTIFIERS = ["`"] 109 STRING_ESCAPES = ["\\"] 110 111 SINGLE_TOKENS = { 112 **tokens.Tokenizer.SINGLE_TOKENS, 113 "$": TokenType.PARAMETER, 114 } 115 116 KEYWORDS = { 117 **tokens.Tokenizer.KEYWORDS, 118 "ADD ARCHIVE": TokenType.COMMAND, 119 "ADD ARCHIVES": TokenType.COMMAND, 120 "ADD FILE": TokenType.COMMAND, 121 "ADD FILES": TokenType.COMMAND, 122 "ADD JAR": TokenType.COMMAND, 123 "ADD JARS": TokenType.COMMAND, 124 "MINUS": TokenType.EXCEPT, 125 "MSCK REPAIR": TokenType.COMMAND, 126 "REFRESH": TokenType.REFRESH, 127 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 128 } 129 130 NUMERIC_LITERALS = { 131 "L": "BIGINT", 132 "S": "SMALLINT", 133 "Y": "TINYINT", 134 "D": "DOUBLE", 135 "F": "FLOAT", 136 "BD": "DECIMAL", 137 } 138 139 Parser = HiveParser 140 141 Generator = HiveGenerator
A NULL arg in CONCAT_WS yields NULL by default, but in some dialects it is skipped.
Hive by default does not update the schema of existing partitions when a column is changed. the CASCADE clause is used to indicate that the change should be propagated to all existing partitions. the Spark dialect, while derived from Hive, does not support the CASCADE clause.
Whether INTERSECT binds more tightly than UNION and EXCEPT when a set operation chain isn't parenthesized. If False, all set operations have equal precedence and associate left to right.
Specifies the strategy according to which identifiers should be normalized.
Associates this dialect's time formats with their equivalent Python strftime formats.
Mapping of an escaped sequence (\n) to its unescaped version (
).
Whether string literals support escape sequences (e.g. \n). Set by the metaclass based on the tokenizer's STRING_ESCAPES.
Whether byte string literals support escape sequences. Set by the metaclass based on the tokenizer's BYTE_STRING_ESCAPES.
Mapping of an identifier escape char (\) to its escaped version (\\). Set by the metaclass based on the tokenizer's IDENTIFIER_ESCAPES.
87 class JSONPathTokenizer(jsonpath.JSONPathTokenizer): 88 VAR_TOKENS = { 89 *jsonpath.JSONPathTokenizer.VAR_TOKENS, 90 TokenType.DASH, 91 }
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- BIT_STRINGS
- BYTE_STRINGS
- HEX_STRINGS
- NATIONAL_RAW_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- IDENTIFIERS
- QUOTES
- VAR_SINGLE_TOKENS
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NUMERIC_ESCAPES
- DROP_UNKNOWN_ESCAPES
- NUMERIC_ESCAPES_ARE_BYTES
- LONE_SURROGATE_REPLACEMENT
- NESTED_COMMENTS
- DASH_COMMENT_REQUIRES_BOUNDARY
- COMMENTS_TERMINATE_AT_NEWLINE_ONLY
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- COMMENTS
- dialect
- tokenize
- sql
- size
- tokens
103 class Tokenizer(tokens.Tokenizer): 104 NUMERIC_ESCAPES = {"u": (16, 4, 4, 0xFFFF), "0": (8, 3, 3, 0x7F)} 105 DROP_UNKNOWN_ESCAPES = True 106 LONE_SURROGATE_REPLACEMENT = "?" 107 QUOTES = ["'", '"'] 108 IDENTIFIERS = ["`"] 109 STRING_ESCAPES = ["\\"] 110 111 SINGLE_TOKENS = { 112 **tokens.Tokenizer.SINGLE_TOKENS, 113 "$": TokenType.PARAMETER, 114 } 115 116 KEYWORDS = { 117 **tokens.Tokenizer.KEYWORDS, 118 "ADD ARCHIVE": TokenType.COMMAND, 119 "ADD ARCHIVES": TokenType.COMMAND, 120 "ADD FILE": TokenType.COMMAND, 121 "ADD FILES": TokenType.COMMAND, 122 "ADD JAR": TokenType.COMMAND, 123 "ADD JARS": TokenType.COMMAND, 124 "MINUS": TokenType.EXCEPT, 125 "MSCK REPAIR": TokenType.COMMAND, 126 "REFRESH": TokenType.REFRESH, 127 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 128 } 129 130 NUMERIC_LITERALS = { 131 "L": "BIGINT", 132 "S": "SMALLINT", 133 "Y": "TINYINT", 134 "D": "DOUBLE", 135 "F": "FLOAT", 136 "BD": "DECIMAL", 137 }
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- BIT_STRINGS
- BYTE_STRINGS
- HEX_STRINGS
- NATIONAL_RAW_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- VAR_SINGLE_TOKENS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NUMERIC_ESCAPES_ARE_BYTES
- NESTED_COMMENTS
- DASH_COMMENT_REQUIRES_BOUNDARY
- COMMENTS_TERMINATE_AT_NEWLINE_ONLY
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMBERS_CAN_HAVE_DECIMALS
- COMMENTS
- dialect
- tokenize
- sql
- size
- tokens