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