sqlglot.dialects.presto
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import tokens 6from sqlglot.dialects.dialect import ( 7 Dialect, 8 NormalizationStrategy, 9) 10from sqlglot.dialects.mysql import MySQL 11from sqlglot.generators.presto import PrestoGenerator 12from sqlglot.parsers.presto import PrestoParser 13from sqlglot.tokens import TokenType 14from sqlglot.typing.presto import EXPRESSION_METADATA 15 16 17class Presto(Dialect): 18 INDEX_OFFSET = 1 19 NULL_ORDERING = "nulls_are_last" 20 TIME_FORMAT = MySQL.TIME_FORMAT 21 STRICT_STRING_CONCAT = True 22 TYPED_DIVISION = True 23 TABLESAMPLE_SIZE_IS_PERCENT = True 24 LOG_BASE_FIRST: bool | None = None 25 SUPPORTS_LIMIT_ALL = True 26 SUPPORTS_VALUES_DEFAULT = False 27 LEAST_GREATEST_IGNORES_NULLS = False 28 UUID_IS_STRING_TYPE = False 29 30 TIME_MAPPING = MySQL.TIME_MAPPING 31 32 # https://github.com/trinodb/trino/issues/17 33 # https://github.com/trinodb/trino/issues/12289 34 # https://github.com/prestodb/presto/issues/2863 35 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 36 37 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 38 39 SUPPORTED_SETTINGS = { 40 *Dialect.SUPPORTED_SETTINGS, 41 "variant_extract_is_json_extract", 42 } 43 44 class Tokenizer(tokens.Tokenizer): 45 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 46 UNICODE_STRINGS = [ 47 (prefix + q, q) 48 for q in t.cast(list[str], tokens.Tokenizer.QUOTES) 49 for prefix in ("U&", "u&") 50 ] 51 52 NESTED_COMMENTS = False 53 54 KEYWORDS = { 55 **tokens.Tokenizer.KEYWORDS, 56 "DEALLOCATE PREPARE": TokenType.COMMAND, 57 "DESCRIBE INPUT": TokenType.COMMAND, 58 "DESCRIBE OUTPUT": TokenType.COMMAND, 59 "RESET SESSION": TokenType.COMMAND, 60 "START": TokenType.BEGIN, 61 "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE, 62 "ROW": TokenType.STRUCT, 63 "IPADDRESS": TokenType.IPADDRESS, 64 "IPPREFIX": TokenType.IPPREFIX, 65 "TDIGEST": TokenType.TDIGEST, 66 "HYPERLOGLOG": TokenType.HLLSKETCH, 67 } 68 KEYWORDS.pop("/*+") 69 KEYWORDS.pop("QUALIFY") 70 71 Parser = PrestoParser 72 73 Generator = PrestoGenerator
18class Presto(Dialect): 19 INDEX_OFFSET = 1 20 NULL_ORDERING = "nulls_are_last" 21 TIME_FORMAT = MySQL.TIME_FORMAT 22 STRICT_STRING_CONCAT = True 23 TYPED_DIVISION = True 24 TABLESAMPLE_SIZE_IS_PERCENT = True 25 LOG_BASE_FIRST: bool | None = None 26 SUPPORTS_LIMIT_ALL = True 27 SUPPORTS_VALUES_DEFAULT = False 28 LEAST_GREATEST_IGNORES_NULLS = False 29 UUID_IS_STRING_TYPE = False 30 31 TIME_MAPPING = MySQL.TIME_MAPPING 32 33 # https://github.com/trinodb/trino/issues/17 34 # https://github.com/trinodb/trino/issues/12289 35 # https://github.com/prestodb/presto/issues/2863 36 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 37 38 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 39 40 SUPPORTED_SETTINGS = { 41 *Dialect.SUPPORTED_SETTINGS, 42 "variant_extract_is_json_extract", 43 } 44 45 class Tokenizer(tokens.Tokenizer): 46 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 47 UNICODE_STRINGS = [ 48 (prefix + q, q) 49 for q in t.cast(list[str], tokens.Tokenizer.QUOTES) 50 for prefix in ("U&", "u&") 51 ] 52 53 NESTED_COMMENTS = False 54 55 KEYWORDS = { 56 **tokens.Tokenizer.KEYWORDS, 57 "DEALLOCATE PREPARE": TokenType.COMMAND, 58 "DESCRIBE INPUT": TokenType.COMMAND, 59 "DESCRIBE OUTPUT": TokenType.COMMAND, 60 "RESET SESSION": TokenType.COMMAND, 61 "START": TokenType.BEGIN, 62 "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE, 63 "ROW": TokenType.STRUCT, 64 "IPADDRESS": TokenType.IPADDRESS, 65 "IPPREFIX": TokenType.IPPREFIX, 66 "TDIGEST": TokenType.TDIGEST, 67 "HYPERLOGLOG": TokenType.HLLSKETCH, 68 } 69 KEYWORDS.pop("/*+") 70 KEYWORDS.pop("QUALIFY") 71 72 Parser = PrestoParser 73 74 Generator = PrestoGenerator
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.
Whether the base comes first in the LOG function.
Possible values: True, False, None (two arguments are not supported by LOG)
Whether LEAST/GREATEST functions ignore NULL values, e.g:
- BigQuery, Snowflake, MySQL, Presto/Trino: LEAST(1, NULL, 2) -> NULL
- Spark, Postgres, DuckDB, TSQL: LEAST(1, NULL, 2) -> 1
Associates this dialect's time formats with their equivalent Python strftime formats.
Specifies the strategy according to which identifiers should be normalized.
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.
45 class Tokenizer(tokens.Tokenizer): 46 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 47 UNICODE_STRINGS = [ 48 (prefix + q, q) 49 for q in t.cast(list[str], tokens.Tokenizer.QUOTES) 50 for prefix in ("U&", "u&") 51 ] 52 53 NESTED_COMMENTS = False 54 55 KEYWORDS = { 56 **tokens.Tokenizer.KEYWORDS, 57 "DEALLOCATE PREPARE": TokenType.COMMAND, 58 "DESCRIBE INPUT": TokenType.COMMAND, 59 "DESCRIBE OUTPUT": TokenType.COMMAND, 60 "RESET SESSION": TokenType.COMMAND, 61 "START": TokenType.BEGIN, 62 "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE, 63 "ROW": TokenType.STRUCT, 64 "IPADDRESS": TokenType.IPADDRESS, 65 "IPPREFIX": TokenType.IPPREFIX, 66 "TDIGEST": TokenType.TDIGEST, 67 "HYPERLOGLOG": TokenType.HLLSKETCH, 68 } 69 KEYWORDS.pop("/*+") 70 KEYWORDS.pop("QUALIFY")
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BIT_STRINGS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- IDENTIFIERS
- QUOTES
- STRING_ESCAPES
- VAR_SINGLE_TOKENS
- ESCAPE_FOLLOW_CHARS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- NUMBERS_CAN_HAVE_DECIMALS
- COMMENTS
- dialect
- tokenize
- sql
- size
- tokens