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 28 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 29 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 30 31 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 32 33 # https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362046#LanguageManualUDF-StringFunctions 34 # https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java#L266-L269 35 INITCAP_DEFAULT_DELIMITER_CHARS = " \t\n\r\f\u000b\u001c\u001d\u001e\u001f" 36 37 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 38 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 39 for target_type in { 40 *exp.DataType.NUMERIC_TYPES, 41 *exp.DataType.TEMPORAL_TYPES, 42 exp.DType.INTERVAL, 43 }: 44 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 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 # Hive 4.0+ parses MM/dd/HH/hh/mm/ss strictly (java.time.DateTimeFormatter, see 56 # HIVE-25458/HIVE-25576) 57 "MM": "%mstrict", 58 "M": "%-m", 59 "dd": "%dstrict", 60 "d": "%-d", 61 "HH": "%Hstrict", 62 "H": "%-H", 63 "hh": "%Istrict", 64 "h": "%-I", 65 "mm": "%Mstrict", 66 "m": "%-M", 67 "ss": "%Sstrict", 68 "s": "%-S", 69 "SSSSSS": "%f", 70 "a": "%p", 71 "DD": "%j", 72 "D": "%-j", 73 "E": "%a", 74 "EE": "%a", 75 "EEE": "%a", 76 "EEEE": "%A", 77 "z": "%Z", 78 "Z": "%z", 79 } 80 81 DATE_FORMAT = "'yyyy-MM-dd'" 82 DATEINT_FORMAT = "'yyyyMMdd'" 83 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 84 85 class JSONPathTokenizer(jsonpath.JSONPathTokenizer): 86 VAR_TOKENS = { 87 *jsonpath.JSONPathTokenizer.VAR_TOKENS, 88 TokenType.DASH, 89 } 90 91 UNESCAPED_SEQUENCES = { 92 "\\0": "\0", 93 "\\Z": "\x1a", 94 "\\%": "\\%", 95 "\\_": "\\_", 96 "\\a": "a", 97 "\\f": "f", 98 "\\v": "v", 99 } 100 101 class Tokenizer(tokens.Tokenizer): 102 NUMERIC_ESCAPES = {"u": (16, 4, 4, 0xFFFF), "0": (8, 3, 3, 0x7F)} 103 DROP_UNKNOWN_ESCAPES = True 104 LONE_SURROGATE_REPLACEMENT = "?" 105 QUOTES = ["'", '"'] 106 IDENTIFIERS = ["`"] 107 STRING_ESCAPES = ["\\"] 108 109 SINGLE_TOKENS = { 110 **tokens.Tokenizer.SINGLE_TOKENS, 111 "$": TokenType.PARAMETER, 112 } 113 114 KEYWORDS = { 115 **tokens.Tokenizer.KEYWORDS, 116 "ADD ARCHIVE": TokenType.COMMAND, 117 "ADD ARCHIVES": TokenType.COMMAND, 118 "ADD FILE": TokenType.COMMAND, 119 "ADD FILES": TokenType.COMMAND, 120 "ADD JAR": TokenType.COMMAND, 121 "ADD JARS": TokenType.COMMAND, 122 "MINUS": TokenType.EXCEPT, 123 "MSCK REPAIR": TokenType.COMMAND, 124 "REFRESH": TokenType.REFRESH, 125 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 126 } 127 128 NUMERIC_LITERALS = { 129 "L": "BIGINT", 130 "S": "SMALLINT", 131 "Y": "TINYINT", 132 "D": "DOUBLE", 133 "F": "FLOAT", 134 "BD": "DECIMAL", 135 } 136 137 Parser = HiveParser 138 139 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 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
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.
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.
86 class JSONPathTokenizer(jsonpath.JSONPathTokenizer): 87 VAR_TOKENS = { 88 *jsonpath.JSONPathTokenizer.VAR_TOKENS, 89 TokenType.DASH, 90 }
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- BIT_STRINGS
- BYTE_STRINGS
- HEX_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
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 }
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- BIT_STRINGS
- BYTE_STRINGS
- HEX_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