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