sqlglot.dialects.postgres
1from __future__ import annotations 2 3from sqlglot import exp, tokens 4from sqlglot.dialects.dialect import Dialect 5from sqlglot.generators.postgres import PostgresGenerator 6from sqlglot.parsers.postgres import PostgresParser 7from sqlglot.tokens import TokenType 8from sqlglot.typing.postgres import EXPRESSION_METADATA 9 10 11class Postgres(Dialect): 12 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 13 INDEX_OFFSET = 1 14 # Normalizing `x IS NOT NULL` to `NOT x IS NULL` is unsafe due to row values, 15 # e.g. `ROW(1, NULL) IS NOT NULL` is false whereas `NOT ROW(1, NULL) IS NULL` is true 16 NORMALIZE_NOT_NULL = False 17 TYPED_DIVISION = True 18 CONCAT_COALESCE = True 19 CONCAT_WS_COALESCE = True 20 NULL_ORDERING = "nulls_are_large" 21 SUPPORTS_LIMIT_ALL = True 22 TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'" 23 TABLESAMPLE_SIZE_IS_PERCENT = True 24 TABLES_REFERENCEABLE_AS_COLUMNS = True 25 26 DEFAULT_FUNCTIONS_COLUMN_NAMES = { 27 exp.ExplodingGenerateSeries: "generate_series", 28 } 29 30 TIME_MAPPING = { 31 "d": "%u", # 1-based day of week 32 "D": "%u", # 1-based day of week 33 "dd": "%d", # day of month 34 "DD": "%d", # day of month 35 "ddd": "%j", # zero padded day of year 36 "DDD": "%j", # zero padded day of year 37 "FMDD": "%-d", # - is no leading zero for Python; same for FM in postgres 38 "FMDDD": "%-j", # day of year 39 "FMHH12": "%-I", # 9 40 "FMHH24": "%-H", # 9 41 "FMMI": "%-M", # Minute 42 "FMMM": "%-m", # 1 43 "FMSS": "%-S", # Second 44 "HH12": "%I", # 09 45 "HH24": "%H", # 09 46 "mi": "%M", # zero padded minute 47 "MI": "%M", # zero padded minute 48 "mm": "%m", # 01 49 "MM": "%m", # 01 50 "OF": "%z", # utc offset 51 "ss": "%S", # zero padded second 52 "SS": "%S", # zero padded second 53 "TMDay": "%A", # TM is locale dependent 54 "TMDy": "%a", 55 "TMMon": "%b", # Sep 56 "TMMonth": "%B", # September 57 "day": "%Aenlower", # tuesday 58 "dy": "%aenlower", # tue 59 "TZ": "%Z", # uppercase timezone name 60 "US": "%f", # zero padded microsecond 61 "ww": "%U", # 1-based week of year 62 "WW": "%U", # 1-based week of year 63 "yy": "%y", # 15 64 "YY": "%y", # 15 65 "yyy": "%Ythree", # 015 66 "YYY": "%Ythree", # 015 67 "yyyy": "%Y", # 2015 68 "YYYY": "%Y", # 2015 69 } 70 71 class Tokenizer(tokens.Tokenizer): 72 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 73 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 74 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 75 UNICODE_STRINGS = [("U&'", "'"), ("u&'", "'")] 76 BYTE_STRING_ESCAPES = ["'", "\\"] 77 HEREDOC_STRINGS = ["$"] 78 79 HEREDOC_TAG_IS_IDENTIFIER = True 80 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 81 82 KEYWORDS = { 83 **tokens.Tokenizer.KEYWORDS, 84 "~": TokenType.RLIKE, 85 "@@": TokenType.DAT, 86 "@?": TokenType.AT_QMARK, 87 "@>": TokenType.AT_GT, 88 "<@": TokenType.LT_AT, 89 "?&": TokenType.QMARK_AMP, 90 "?|": TokenType.QMARK_PIPE, 91 "#-": TokenType.HASH_DASH, 92 "|/": TokenType.PIPE_SLASH, 93 "||/": TokenType.DPIPE_SLASH, 94 "BEGIN": TokenType.BEGIN, 95 "BIGSERIAL": TokenType.BIGSERIAL, 96 "CSTRING": TokenType.PSEUDO_TYPE, 97 "DECLARE": TokenType.COMMAND, 98 "DO": TokenType.COMMAND, 99 "EXEC": TokenType.COMMAND, 100 "HSTORE": TokenType.HSTORE, 101 "INT8": TokenType.BIGINT, 102 "MONEY": TokenType.MONEY, 103 "NAME": TokenType.NAME, 104 "OID": TokenType.OBJECT_IDENTIFIER, 105 "ONLY": TokenType.ONLY, 106 "POINT": TokenType.POINT, 107 "REFRESH": TokenType.COMMAND, 108 "REINDEX": TokenType.COMMAND, 109 "RESET": TokenType.COMMAND, 110 "SERIAL": TokenType.SERIAL, 111 "SMALLSERIAL": TokenType.SMALLSERIAL, 112 "TEMP": TokenType.TEMPORARY, 113 "TYPE": TokenType.TYPE, 114 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 115 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 116 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 117 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 118 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 119 "REGOPER": TokenType.OBJECT_IDENTIFIER, 120 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 121 "REGPROC": TokenType.OBJECT_IDENTIFIER, 122 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 123 "REGROLE": TokenType.OBJECT_IDENTIFIER, 124 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 125 "FLOAT": TokenType.DOUBLE, 126 "XML": TokenType.XML, 127 "VARIADIC": TokenType.VARIADIC, 128 "INOUT": TokenType.INOUT, 129 } 130 KEYWORDS.pop("/*+") 131 KEYWORDS.pop("DIV") 132 133 SINGLE_TOKENS = { 134 **tokens.Tokenizer.SINGLE_TOKENS, 135 "$": TokenType.HEREDOC_STRING, 136 } 137 138 VAR_SINGLE_TOKENS = {"$"} 139 140 Parser = PostgresParser 141 142 Generator = PostgresGenerator
12class Postgres(Dialect): 13 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 14 INDEX_OFFSET = 1 15 # Normalizing `x IS NOT NULL` to `NOT x IS NULL` is unsafe due to row values, 16 # e.g. `ROW(1, NULL) IS NOT NULL` is false whereas `NOT ROW(1, NULL) IS NULL` is true 17 NORMALIZE_NOT_NULL = False 18 TYPED_DIVISION = True 19 CONCAT_COALESCE = True 20 CONCAT_WS_COALESCE = True 21 NULL_ORDERING = "nulls_are_large" 22 SUPPORTS_LIMIT_ALL = True 23 TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'" 24 TABLESAMPLE_SIZE_IS_PERCENT = True 25 TABLES_REFERENCEABLE_AS_COLUMNS = True 26 27 DEFAULT_FUNCTIONS_COLUMN_NAMES = { 28 exp.ExplodingGenerateSeries: "generate_series", 29 } 30 31 TIME_MAPPING = { 32 "d": "%u", # 1-based day of week 33 "D": "%u", # 1-based day of week 34 "dd": "%d", # day of month 35 "DD": "%d", # day of month 36 "ddd": "%j", # zero padded day of year 37 "DDD": "%j", # zero padded day of year 38 "FMDD": "%-d", # - is no leading zero for Python; same for FM in postgres 39 "FMDDD": "%-j", # day of year 40 "FMHH12": "%-I", # 9 41 "FMHH24": "%-H", # 9 42 "FMMI": "%-M", # Minute 43 "FMMM": "%-m", # 1 44 "FMSS": "%-S", # Second 45 "HH12": "%I", # 09 46 "HH24": "%H", # 09 47 "mi": "%M", # zero padded minute 48 "MI": "%M", # zero padded minute 49 "mm": "%m", # 01 50 "MM": "%m", # 01 51 "OF": "%z", # utc offset 52 "ss": "%S", # zero padded second 53 "SS": "%S", # zero padded second 54 "TMDay": "%A", # TM is locale dependent 55 "TMDy": "%a", 56 "TMMon": "%b", # Sep 57 "TMMonth": "%B", # September 58 "day": "%Aenlower", # tuesday 59 "dy": "%aenlower", # tue 60 "TZ": "%Z", # uppercase timezone name 61 "US": "%f", # zero padded microsecond 62 "ww": "%U", # 1-based week of year 63 "WW": "%U", # 1-based week of year 64 "yy": "%y", # 15 65 "YY": "%y", # 15 66 "yyy": "%Ythree", # 015 67 "YYY": "%Ythree", # 015 68 "yyyy": "%Y", # 2015 69 "YYYY": "%Y", # 2015 70 } 71 72 class Tokenizer(tokens.Tokenizer): 73 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 74 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 75 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 76 UNICODE_STRINGS = [("U&'", "'"), ("u&'", "'")] 77 BYTE_STRING_ESCAPES = ["'", "\\"] 78 HEREDOC_STRINGS = ["$"] 79 80 HEREDOC_TAG_IS_IDENTIFIER = True 81 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 82 83 KEYWORDS = { 84 **tokens.Tokenizer.KEYWORDS, 85 "~": TokenType.RLIKE, 86 "@@": TokenType.DAT, 87 "@?": TokenType.AT_QMARK, 88 "@>": TokenType.AT_GT, 89 "<@": TokenType.LT_AT, 90 "?&": TokenType.QMARK_AMP, 91 "?|": TokenType.QMARK_PIPE, 92 "#-": TokenType.HASH_DASH, 93 "|/": TokenType.PIPE_SLASH, 94 "||/": TokenType.DPIPE_SLASH, 95 "BEGIN": TokenType.BEGIN, 96 "BIGSERIAL": TokenType.BIGSERIAL, 97 "CSTRING": TokenType.PSEUDO_TYPE, 98 "DECLARE": TokenType.COMMAND, 99 "DO": TokenType.COMMAND, 100 "EXEC": TokenType.COMMAND, 101 "HSTORE": TokenType.HSTORE, 102 "INT8": TokenType.BIGINT, 103 "MONEY": TokenType.MONEY, 104 "NAME": TokenType.NAME, 105 "OID": TokenType.OBJECT_IDENTIFIER, 106 "ONLY": TokenType.ONLY, 107 "POINT": TokenType.POINT, 108 "REFRESH": TokenType.COMMAND, 109 "REINDEX": TokenType.COMMAND, 110 "RESET": TokenType.COMMAND, 111 "SERIAL": TokenType.SERIAL, 112 "SMALLSERIAL": TokenType.SMALLSERIAL, 113 "TEMP": TokenType.TEMPORARY, 114 "TYPE": TokenType.TYPE, 115 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 116 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 117 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 118 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 119 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 120 "REGOPER": TokenType.OBJECT_IDENTIFIER, 121 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 122 "REGPROC": TokenType.OBJECT_IDENTIFIER, 123 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 124 "REGROLE": TokenType.OBJECT_IDENTIFIER, 125 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 126 "FLOAT": TokenType.DOUBLE, 127 "XML": TokenType.XML, 128 "VARIADIC": TokenType.VARIADIC, 129 "INOUT": TokenType.INOUT, 130 } 131 KEYWORDS.pop("/*+") 132 KEYWORDS.pop("DIV") 133 134 SINGLE_TOKENS = { 135 **tokens.Tokenizer.SINGLE_TOKENS, 136 "$": TokenType.HEREDOC_STRING, 137 } 138 139 VAR_SINGLE_TOKENS = {"$"} 140 141 Parser = PostgresParser 142 143 Generator = PostgresGenerator
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.
A NULL arg in CONCAT_WS yields NULL by default, but in some dialects it is skipped.
Default NULL ordering method to use if not explicitly set.
Possible values: "nulls_are_small", "nulls_are_large", "nulls_are_last"
Whether table names can be referenced as columns (treated as structs).
BigQuery allows tables to be referenced as columns in queries, automatically treating them as struct values containing all the table's columns.
For example, in BigQuery: SELECT t FROM my_table AS t -- Returns entire row as a struct
Maps function expressions to their default output column name(s).
For example, in Postgres, generate_series function outputs a column named "generate_series" by default, so we map the ExplodingGenerateSeries expression to "generate_series" string.
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.
72 class Tokenizer(tokens.Tokenizer): 73 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 74 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 75 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 76 UNICODE_STRINGS = [("U&'", "'"), ("u&'", "'")] 77 BYTE_STRING_ESCAPES = ["'", "\\"] 78 HEREDOC_STRINGS = ["$"] 79 80 HEREDOC_TAG_IS_IDENTIFIER = True 81 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 82 83 KEYWORDS = { 84 **tokens.Tokenizer.KEYWORDS, 85 "~": TokenType.RLIKE, 86 "@@": TokenType.DAT, 87 "@?": TokenType.AT_QMARK, 88 "@>": TokenType.AT_GT, 89 "<@": TokenType.LT_AT, 90 "?&": TokenType.QMARK_AMP, 91 "?|": TokenType.QMARK_PIPE, 92 "#-": TokenType.HASH_DASH, 93 "|/": TokenType.PIPE_SLASH, 94 "||/": TokenType.DPIPE_SLASH, 95 "BEGIN": TokenType.BEGIN, 96 "BIGSERIAL": TokenType.BIGSERIAL, 97 "CSTRING": TokenType.PSEUDO_TYPE, 98 "DECLARE": TokenType.COMMAND, 99 "DO": TokenType.COMMAND, 100 "EXEC": TokenType.COMMAND, 101 "HSTORE": TokenType.HSTORE, 102 "INT8": TokenType.BIGINT, 103 "MONEY": TokenType.MONEY, 104 "NAME": TokenType.NAME, 105 "OID": TokenType.OBJECT_IDENTIFIER, 106 "ONLY": TokenType.ONLY, 107 "POINT": TokenType.POINT, 108 "REFRESH": TokenType.COMMAND, 109 "REINDEX": TokenType.COMMAND, 110 "RESET": TokenType.COMMAND, 111 "SERIAL": TokenType.SERIAL, 112 "SMALLSERIAL": TokenType.SMALLSERIAL, 113 "TEMP": TokenType.TEMPORARY, 114 "TYPE": TokenType.TYPE, 115 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 116 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 117 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 118 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 119 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 120 "REGOPER": TokenType.OBJECT_IDENTIFIER, 121 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 122 "REGPROC": TokenType.OBJECT_IDENTIFIER, 123 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 124 "REGROLE": TokenType.OBJECT_IDENTIFIER, 125 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 126 "FLOAT": TokenType.DOUBLE, 127 "XML": TokenType.XML, 128 "VARIADIC": TokenType.VARIADIC, 129 "INOUT": TokenType.INOUT, 130 } 131 KEYWORDS.pop("/*+") 132 KEYWORDS.pop("DIV") 133 134 SINGLE_TOKENS = { 135 **tokens.Tokenizer.SINGLE_TOKENS, 136 "$": TokenType.HEREDOC_STRING, 137 } 138 139 VAR_SINGLE_TOKENS = {"$"}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- RAW_STRINGS
- IDENTIFIERS
- QUOTES
- STRING_ESCAPES
- ESCAPE_FOLLOW_CHARS
- IDENTIFIER_ESCAPES
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMANDS
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- NUMBERS_CAN_HAVE_DECIMALS
- COMMENTS
- dialect
- tokenize
- sql
- size
- tokens