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 TYPED_DIVISION = True 15 CONCAT_COALESCE = True 16 CONCAT_WS_COALESCE = True 17 NULL_ORDERING = "nulls_are_large" 18 SUPPORTS_LIMIT_ALL = True 19 TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'" 20 TABLESAMPLE_SIZE_IS_PERCENT = True 21 TABLES_REFERENCEABLE_AS_COLUMNS = True 22 23 DEFAULT_FUNCTIONS_COLUMN_NAMES = { 24 exp.ExplodingGenerateSeries: "generate_series", 25 } 26 27 TIME_MAPPING = { 28 "d": "%u", # 1-based day of week 29 "D": "%u", # 1-based day of week 30 "dd": "%d", # day of month 31 "DD": "%d", # day of month 32 "ddd": "%j", # zero padded day of year 33 "DDD": "%j", # zero padded day of year 34 "FMDD": "%-d", # - is no leading zero for Python; same for FM in postgres 35 "FMDDD": "%-j", # day of year 36 "FMHH12": "%-I", # 9 37 "FMHH24": "%-H", # 9 38 "FMMI": "%-M", # Minute 39 "FMMM": "%-m", # 1 40 "FMSS": "%-S", # Second 41 "HH12": "%I", # 09 42 "HH24": "%H", # 09 43 "mi": "%M", # zero padded minute 44 "MI": "%M", # zero padded minute 45 "mm": "%m", # 01 46 "MM": "%m", # 01 47 "OF": "%z", # utc offset 48 "ss": "%S", # zero padded second 49 "SS": "%S", # zero padded second 50 "TMDay": "%A", # TM is locale dependent 51 "TMDy": "%a", 52 "TMMon": "%b", # Sep 53 "TMMonth": "%B", # September 54 "TZ": "%Z", # uppercase timezone name 55 "US": "%f", # zero padded microsecond 56 "ww": "%U", # 1-based week of year 57 "WW": "%U", # 1-based week of year 58 "yy": "%y", # 15 59 "YY": "%y", # 15 60 "yyyy": "%Y", # 2015 61 "YYYY": "%Y", # 2015 62 } 63 64 class Tokenizer(tokens.Tokenizer): 65 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 66 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 67 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 68 BYTE_STRING_ESCAPES = ["'", "\\"] 69 HEREDOC_STRINGS = ["$"] 70 71 HEREDOC_TAG_IS_IDENTIFIER = True 72 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 73 74 KEYWORDS = { 75 **tokens.Tokenizer.KEYWORDS, 76 "~": TokenType.RLIKE, 77 "@@": TokenType.DAT, 78 "@>": TokenType.AT_GT, 79 "<@": TokenType.LT_AT, 80 "?&": TokenType.QMARK_AMP, 81 "?|": TokenType.QMARK_PIPE, 82 "#-": TokenType.HASH_DASH, 83 "|/": TokenType.PIPE_SLASH, 84 "||/": TokenType.DPIPE_SLASH, 85 "BEGIN": TokenType.BEGIN, 86 "BIGSERIAL": TokenType.BIGSERIAL, 87 "CSTRING": TokenType.PSEUDO_TYPE, 88 "DECLARE": TokenType.COMMAND, 89 "DO": TokenType.COMMAND, 90 "EXEC": TokenType.COMMAND, 91 "HSTORE": TokenType.HSTORE, 92 "INT8": TokenType.BIGINT, 93 "MONEY": TokenType.MONEY, 94 "NAME": TokenType.NAME, 95 "OID": TokenType.OBJECT_IDENTIFIER, 96 "ONLY": TokenType.ONLY, 97 "POINT": TokenType.POINT, 98 "REFRESH": TokenType.COMMAND, 99 "REINDEX": TokenType.COMMAND, 100 "RESET": TokenType.COMMAND, 101 "SERIAL": TokenType.SERIAL, 102 "SMALLSERIAL": TokenType.SMALLSERIAL, 103 "TEMP": TokenType.TEMPORARY, 104 "TYPE": TokenType.TYPE, 105 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 106 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 107 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 108 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 109 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 110 "REGOPER": TokenType.OBJECT_IDENTIFIER, 111 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 112 "REGPROC": TokenType.OBJECT_IDENTIFIER, 113 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 114 "REGROLE": TokenType.OBJECT_IDENTIFIER, 115 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 116 "FLOAT": TokenType.DOUBLE, 117 "XML": TokenType.XML, 118 "VARIADIC": TokenType.VARIADIC, 119 "INOUT": TokenType.INOUT, 120 } 121 KEYWORDS.pop("/*+") 122 KEYWORDS.pop("DIV") 123 124 SINGLE_TOKENS = { 125 **tokens.Tokenizer.SINGLE_TOKENS, 126 "$": TokenType.HEREDOC_STRING, 127 } 128 129 VAR_SINGLE_TOKENS = {"$"} 130 131 Parser = PostgresParser 132 133 Generator = PostgresGenerator
12class Postgres(Dialect): 13 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 14 INDEX_OFFSET = 1 15 TYPED_DIVISION = True 16 CONCAT_COALESCE = True 17 CONCAT_WS_COALESCE = True 18 NULL_ORDERING = "nulls_are_large" 19 SUPPORTS_LIMIT_ALL = True 20 TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'" 21 TABLESAMPLE_SIZE_IS_PERCENT = True 22 TABLES_REFERENCEABLE_AS_COLUMNS = True 23 24 DEFAULT_FUNCTIONS_COLUMN_NAMES = { 25 exp.ExplodingGenerateSeries: "generate_series", 26 } 27 28 TIME_MAPPING = { 29 "d": "%u", # 1-based day of week 30 "D": "%u", # 1-based day of week 31 "dd": "%d", # day of month 32 "DD": "%d", # day of month 33 "ddd": "%j", # zero padded day of year 34 "DDD": "%j", # zero padded day of year 35 "FMDD": "%-d", # - is no leading zero for Python; same for FM in postgres 36 "FMDDD": "%-j", # day of year 37 "FMHH12": "%-I", # 9 38 "FMHH24": "%-H", # 9 39 "FMMI": "%-M", # Minute 40 "FMMM": "%-m", # 1 41 "FMSS": "%-S", # Second 42 "HH12": "%I", # 09 43 "HH24": "%H", # 09 44 "mi": "%M", # zero padded minute 45 "MI": "%M", # zero padded minute 46 "mm": "%m", # 01 47 "MM": "%m", # 01 48 "OF": "%z", # utc offset 49 "ss": "%S", # zero padded second 50 "SS": "%S", # zero padded second 51 "TMDay": "%A", # TM is locale dependent 52 "TMDy": "%a", 53 "TMMon": "%b", # Sep 54 "TMMonth": "%B", # September 55 "TZ": "%Z", # uppercase timezone name 56 "US": "%f", # zero padded microsecond 57 "ww": "%U", # 1-based week of year 58 "WW": "%U", # 1-based week of year 59 "yy": "%y", # 15 60 "YY": "%y", # 15 61 "yyyy": "%Y", # 2015 62 "YYYY": "%Y", # 2015 63 } 64 65 class Tokenizer(tokens.Tokenizer): 66 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 67 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 68 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 69 BYTE_STRING_ESCAPES = ["'", "\\"] 70 HEREDOC_STRINGS = ["$"] 71 72 HEREDOC_TAG_IS_IDENTIFIER = True 73 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 74 75 KEYWORDS = { 76 **tokens.Tokenizer.KEYWORDS, 77 "~": TokenType.RLIKE, 78 "@@": TokenType.DAT, 79 "@>": TokenType.AT_GT, 80 "<@": TokenType.LT_AT, 81 "?&": TokenType.QMARK_AMP, 82 "?|": TokenType.QMARK_PIPE, 83 "#-": TokenType.HASH_DASH, 84 "|/": TokenType.PIPE_SLASH, 85 "||/": TokenType.DPIPE_SLASH, 86 "BEGIN": TokenType.BEGIN, 87 "BIGSERIAL": TokenType.BIGSERIAL, 88 "CSTRING": TokenType.PSEUDO_TYPE, 89 "DECLARE": TokenType.COMMAND, 90 "DO": TokenType.COMMAND, 91 "EXEC": TokenType.COMMAND, 92 "HSTORE": TokenType.HSTORE, 93 "INT8": TokenType.BIGINT, 94 "MONEY": TokenType.MONEY, 95 "NAME": TokenType.NAME, 96 "OID": TokenType.OBJECT_IDENTIFIER, 97 "ONLY": TokenType.ONLY, 98 "POINT": TokenType.POINT, 99 "REFRESH": TokenType.COMMAND, 100 "REINDEX": TokenType.COMMAND, 101 "RESET": TokenType.COMMAND, 102 "SERIAL": TokenType.SERIAL, 103 "SMALLSERIAL": TokenType.SMALLSERIAL, 104 "TEMP": TokenType.TEMPORARY, 105 "TYPE": TokenType.TYPE, 106 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 107 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 108 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 109 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 110 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 111 "REGOPER": TokenType.OBJECT_IDENTIFIER, 112 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 113 "REGPROC": TokenType.OBJECT_IDENTIFIER, 114 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 115 "REGROLE": TokenType.OBJECT_IDENTIFIER, 116 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 117 "FLOAT": TokenType.DOUBLE, 118 "XML": TokenType.XML, 119 "VARIADIC": TokenType.VARIADIC, 120 "INOUT": TokenType.INOUT, 121 } 122 KEYWORDS.pop("/*+") 123 KEYWORDS.pop("DIV") 124 125 SINGLE_TOKENS = { 126 **tokens.Tokenizer.SINGLE_TOKENS, 127 "$": TokenType.HEREDOC_STRING, 128 } 129 130 VAR_SINGLE_TOKENS = {"$"} 131 132 Parser = PostgresParser 133 134 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.
65 class Tokenizer(tokens.Tokenizer): 66 BIT_STRINGS = [("b'", "'"), ("B'", "'")] 67 HEX_STRINGS = [("x'", "'"), ("X'", "'")] 68 BYTE_STRINGS = [("e'", "'"), ("E'", "'")] 69 BYTE_STRING_ESCAPES = ["'", "\\"] 70 HEREDOC_STRINGS = ["$"] 71 72 HEREDOC_TAG_IS_IDENTIFIER = True 73 HEREDOC_STRING_ALTERNATIVE = TokenType.PARAMETER 74 75 KEYWORDS = { 76 **tokens.Tokenizer.KEYWORDS, 77 "~": TokenType.RLIKE, 78 "@@": TokenType.DAT, 79 "@>": TokenType.AT_GT, 80 "<@": TokenType.LT_AT, 81 "?&": TokenType.QMARK_AMP, 82 "?|": TokenType.QMARK_PIPE, 83 "#-": TokenType.HASH_DASH, 84 "|/": TokenType.PIPE_SLASH, 85 "||/": TokenType.DPIPE_SLASH, 86 "BEGIN": TokenType.BEGIN, 87 "BIGSERIAL": TokenType.BIGSERIAL, 88 "CSTRING": TokenType.PSEUDO_TYPE, 89 "DECLARE": TokenType.COMMAND, 90 "DO": TokenType.COMMAND, 91 "EXEC": TokenType.COMMAND, 92 "HSTORE": TokenType.HSTORE, 93 "INT8": TokenType.BIGINT, 94 "MONEY": TokenType.MONEY, 95 "NAME": TokenType.NAME, 96 "OID": TokenType.OBJECT_IDENTIFIER, 97 "ONLY": TokenType.ONLY, 98 "POINT": TokenType.POINT, 99 "REFRESH": TokenType.COMMAND, 100 "REINDEX": TokenType.COMMAND, 101 "RESET": TokenType.COMMAND, 102 "SERIAL": TokenType.SERIAL, 103 "SMALLSERIAL": TokenType.SMALLSERIAL, 104 "TEMP": TokenType.TEMPORARY, 105 "TYPE": TokenType.TYPE, 106 "REGCLASS": TokenType.OBJECT_IDENTIFIER, 107 "REGCOLLATION": TokenType.OBJECT_IDENTIFIER, 108 "REGCONFIG": TokenType.OBJECT_IDENTIFIER, 109 "REGDICTIONARY": TokenType.OBJECT_IDENTIFIER, 110 "REGNAMESPACE": TokenType.OBJECT_IDENTIFIER, 111 "REGOPER": TokenType.OBJECT_IDENTIFIER, 112 "REGOPERATOR": TokenType.OBJECT_IDENTIFIER, 113 "REGPROC": TokenType.OBJECT_IDENTIFIER, 114 "REGPROCEDURE": TokenType.OBJECT_IDENTIFIER, 115 "REGROLE": TokenType.OBJECT_IDENTIFIER, 116 "REGTYPE": TokenType.OBJECT_IDENTIFIER, 117 "FLOAT": TokenType.DOUBLE, 118 "XML": TokenType.XML, 119 "VARIADIC": TokenType.VARIADIC, 120 "INOUT": TokenType.INOUT, 121 } 122 KEYWORDS.pop("/*+") 123 KEYWORDS.pop("DIV") 124 125 SINGLE_TOKENS = { 126 **tokens.Tokenizer.SINGLE_TOKENS, 127 "$": TokenType.HEREDOC_STRING, 128 } 129 130 VAR_SINGLE_TOKENS = {"$"}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- RAW_STRINGS
- UNICODE_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

