Edit on GitHub

sqlglot expressions - JSON functions.

  1"""sqlglot expressions - JSON functions."""
  2
  3from __future__ import annotations
  4
  5from sqlglot.expressions.core import Expression, Func, AggFunc, Binary, Predicate
  6
  7
  8class CheckJson(Expression, Func):
  9    arg_types = {"this": True}
 10
 11
 12class JSONArray(Expression, Func):
 13    arg_types = {
 14        "expressions": False,
 15        "null_handling": False,
 16        "return_type": False,
 17        "strict": False,
 18    }
 19    is_var_len_args = True
 20
 21
 22class JSONArrayAgg(Expression, AggFunc):
 23    arg_types = {
 24        "this": True,
 25        "order": False,
 26        "null_handling": False,
 27        "return_type": False,
 28        "strict": False,
 29    }
 30
 31
 32class JSONArrayAppend(Expression, Func):
 33    arg_types = {"this": True, "expressions": True}
 34    is_var_len_args = True
 35    _sql_names = ["JSON_ARRAY_APPEND"]
 36
 37
 38class JSONArrayContains(Expression, Binary, Predicate, Func):
 39    arg_types = {"this": True, "expression": True, "json_type": False}
 40    _sql_names = ["JSON_ARRAY_CONTAINS"]
 41
 42
 43class JSONArrayInsert(Expression, Func):
 44    arg_types = {"this": True, "expressions": True}
 45    is_var_len_args = True
 46    _sql_names = ["JSON_ARRAY_INSERT"]
 47
 48
 49class JSONBContains(Expression, Binary, Func):
 50    _sql_names = ["JSONB_CONTAINS"]
 51
 52
 53class JSONBContainsAllTopKeys(Expression, Binary, Func):
 54    pass
 55
 56
 57class JSONBContainsAnyTopKeys(Expression, Binary, Func):
 58    pass
 59
 60
 61class JSONBDeleteAtPath(Expression, Binary, Func):
 62    pass
 63
 64
 65class JSONBPathExists(Expression, Binary, Predicate, Func):
 66    pass
 67
 68
 69class JSONBExists(Expression, Func):
 70    arg_types = {"this": True, "path": True}
 71    _sql_names = ["JSONB_EXISTS"]
 72
 73
 74class JSONBExtract(Expression, Binary, Func):
 75    _sql_names = ["JSONB_EXTRACT"]
 76
 77
 78class JSONBExtractScalar(Expression, Binary, Func):
 79    arg_types = {"this": True, "expression": True, "json_type": False}
 80    _sql_names = ["JSONB_EXTRACT_SCALAR"]
 81
 82
 83class JSONBObjectAgg(Expression, AggFunc):
 84    arg_types = {"this": True, "expression": True}
 85
 86
 87class JSONBool(Expression, Func):
 88    pass
 89
 90
 91class JSONExists(Expression, Func):
 92    arg_types = {
 93        "this": True,
 94        "path": True,
 95        "passing": False,
 96        "on_condition": False,
 97        "from_dcolonqmark": False,
 98    }
 99
100
101class JSONExtract(Expression, Binary, Func):
102    arg_types = {
103        "this": True,
104        "expression": True,
105        "only_json_types": False,
106        "expressions": False,
107        "variant_extract": False,
108        "json_query": False,
109        "option": False,
110        "quote": False,
111        "on_condition": False,
112        "requires_json": False,
113        "emits": False,
114    }
115    _sql_names = ["JSON_EXTRACT"]
116    is_var_len_args = True
117
118    @property
119    def output_name(self) -> str:
120        return self.expression.output_name if not self.expressions else ""
121
122
123class JSONExtractArray(Expression, Func):
124    arg_types = {"this": True, "expression": False}
125    _sql_names = ["JSON_EXTRACT_ARRAY"]
126
127
128class JSONExtractScalar(Expression, Binary, Func):
129    arg_types = {
130        "this": True,
131        "expression": True,
132        "only_json_types": False,
133        "expressions": False,
134        "json_type": False,
135        "scalar_only": False,
136    }
137    _sql_names = ["JSON_EXTRACT_SCALAR"]
138    is_var_len_args = True
139
140    @property
141    def output_name(self) -> str:
142        return self.expression.output_name
143
144
145class JSONFormat(Expression, Func):
146    arg_types = {"this": False, "options": False, "is_json": False, "to_json": False}
147    _sql_names = ["JSON_FORMAT"]
148
149
150class JSONKeys(Expression, Func):
151    arg_types = {"this": True, "expression": False, "expressions": False}
152    is_var_len_args = True
153    _sql_names = ["JSON_KEYS"]
154
155
156class JSONKeysAtDepth(Expression, Func):
157    arg_types = {"this": True, "expression": False, "mode": False}
158
159
160class JSONObject(Expression, Func):
161    arg_types = {
162        "expressions": False,
163        "null_handling": False,
164        "unique_keys": False,
165        "return_type": False,
166        "encoding": False,
167    }
168
169
170class JSONObjectAgg(Expression, AggFunc):
171    arg_types = {
172        "expressions": False,
173        "null_handling": False,
174        "unique_keys": False,
175        "return_type": False,
176        "encoding": False,
177    }
178
179
180class JSONRemove(Expression, Func):
181    arg_types = {"this": True, "expressions": True}
182    is_var_len_args = True
183    _sql_names = ["JSON_REMOVE"]
184
185
186class JSONSet(Expression, Func):
187    arg_types = {"this": True, "expressions": True}
188    is_var_len_args = True
189    _sql_names = ["JSON_SET"]
190
191
192class JSONStripNulls(Expression, Func):
193    arg_types = {
194        "this": True,
195        "expression": False,
196        "include_arrays": False,
197        "remove_empty": False,
198    }
199    _sql_names = ["JSON_STRIP_NULLS"]
200
201
202class StripNullValue(Expression, Func):
203    pass
204
205
206class JSONTable(Expression, Func):
207    arg_types = {
208        "this": True,
209        "schema": True,
210        "path": False,
211        "error_handling": False,
212        "empty_handling": False,
213    }
214
215
216class JSONType(Expression, Func):
217    arg_types = {"this": True, "expression": False}
218    _sql_names = ["JSON_TYPE"]
219
220
221class ObjectId(Expression, Func):
222    arg_types = {"this": True, "expression": False}
223
224
225class ObjectInsert(Expression, Func):
226    arg_types = {
227        "this": True,
228        "key": True,
229        "value": True,
230        "update_flag": False,
231    }
232
233
234class OpenJSON(Expression, Func):
235    arg_types = {"this": True, "path": False, "expressions": False}
236
237
238class ParseJSON(Expression, Func):
239    # BigQuery, Snowflake have PARSE_JSON, Presto has JSON_PARSE
240    # Snowflake also has TRY_PARSE_JSON, which is represented using `safe`
241    _sql_names = ["PARSE_JSON", "JSON_PARSE"]
242    arg_types = {"this": True, "expression": False, "safe": False}
 9class CheckJson(Expression, Func):
10    arg_types = {"this": True}
arg_types = {'this': True}
key: ClassVar[str] = 'checkjson'
required_args: 't.ClassVar[set[str]]' = {'this'}
13class JSONArray(Expression, Func):
14    arg_types = {
15        "expressions": False,
16        "null_handling": False,
17        "return_type": False,
18        "strict": False,
19    }
20    is_var_len_args = True
arg_types = {'expressions': False, 'null_handling': False, 'return_type': False, 'strict': False}
is_var_len_args = True
key: ClassVar[str] = 'jsonarray'
required_args: 't.ClassVar[set[str]]' = set()
23class JSONArrayAgg(Expression, AggFunc):
24    arg_types = {
25        "this": True,
26        "order": False,
27        "null_handling": False,
28        "return_type": False,
29        "strict": False,
30    }
arg_types = {'this': True, 'order': False, 'null_handling': False, 'return_type': False, 'strict': False}
key: ClassVar[str] = 'jsonarrayagg'
required_args: 't.ClassVar[set[str]]' = {'this'}
33class JSONArrayAppend(Expression, Func):
34    arg_types = {"this": True, "expressions": True}
35    is_var_len_args = True
36    _sql_names = ["JSON_ARRAY_APPEND"]
arg_types = {'this': True, 'expressions': True}
is_var_len_args = True
key: ClassVar[str] = 'jsonarrayappend'
required_args: 't.ClassVar[set[str]]' = {'this', 'expressions'}
39class JSONArrayContains(Expression, Binary, Predicate, Func):
40    arg_types = {"this": True, "expression": True, "json_type": False}
41    _sql_names = ["JSON_ARRAY_CONTAINS"]
arg_types = {'this': True, 'expression': True, 'json_type': False}
key: ClassVar[str] = 'jsonarraycontains'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
44class JSONArrayInsert(Expression, Func):
45    arg_types = {"this": True, "expressions": True}
46    is_var_len_args = True
47    _sql_names = ["JSON_ARRAY_INSERT"]
arg_types = {'this': True, 'expressions': True}
is_var_len_args = True
key: ClassVar[str] = 'jsonarrayinsert'
required_args: 't.ClassVar[set[str]]' = {'this', 'expressions'}
50class JSONBContains(Expression, Binary, Func):
51    _sql_names = ["JSONB_CONTAINS"]
key: ClassVar[str] = 'jsonbcontains'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
54class JSONBContainsAllTopKeys(Expression, Binary, Func):
55    pass
key: ClassVar[str] = 'jsonbcontainsalltopkeys'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
58class JSONBContainsAnyTopKeys(Expression, Binary, Func):
59    pass
key: ClassVar[str] = 'jsonbcontainsanytopkeys'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
62class JSONBDeleteAtPath(Expression, Binary, Func):
63    pass
key: ClassVar[str] = 'jsonbdeleteatpath'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
66class JSONBPathExists(Expression, Binary, Predicate, Func):
67    pass
key: ClassVar[str] = 'jsonbpathexists'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
70class JSONBExists(Expression, Func):
71    arg_types = {"this": True, "path": True}
72    _sql_names = ["JSONB_EXISTS"]
arg_types = {'this': True, 'path': True}
key: ClassVar[str] = 'jsonbexists'
required_args: 't.ClassVar[set[str]]' = {'path', 'this'}
75class JSONBExtract(Expression, Binary, Func):
76    _sql_names = ["JSONB_EXTRACT"]
key: ClassVar[str] = 'jsonbextract'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
79class JSONBExtractScalar(Expression, Binary, Func):
80    arg_types = {"this": True, "expression": True, "json_type": False}
81    _sql_names = ["JSONB_EXTRACT_SCALAR"]
arg_types = {'this': True, 'expression': True, 'json_type': False}
key: ClassVar[str] = 'jsonbextractscalar'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
84class JSONBObjectAgg(Expression, AggFunc):
85    arg_types = {"this": True, "expression": True}
arg_types = {'this': True, 'expression': True}
key: ClassVar[str] = 'jsonbobjectagg'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
88class JSONBool(Expression, Func):
89    pass
key: ClassVar[str] = 'jsonbool'
required_args: 't.ClassVar[set[str]]' = {'this'}
92class JSONExists(Expression, Func):
93    arg_types = {
94        "this": True,
95        "path": True,
96        "passing": False,
97        "on_condition": False,
98        "from_dcolonqmark": False,
99    }
arg_types = {'this': True, 'path': True, 'passing': False, 'on_condition': False, 'from_dcolonqmark': False}
key: ClassVar[str] = 'jsonexists'
required_args: 't.ClassVar[set[str]]' = {'path', 'this'}
102class JSONExtract(Expression, Binary, Func):
103    arg_types = {
104        "this": True,
105        "expression": True,
106        "only_json_types": False,
107        "expressions": False,
108        "variant_extract": False,
109        "json_query": False,
110        "option": False,
111        "quote": False,
112        "on_condition": False,
113        "requires_json": False,
114        "emits": False,
115    }
116    _sql_names = ["JSON_EXTRACT"]
117    is_var_len_args = True
118
119    @property
120    def output_name(self) -> str:
121        return self.expression.output_name if not self.expressions else ""
arg_types = {'this': True, 'expression': True, 'only_json_types': False, 'expressions': False, 'variant_extract': False, 'json_query': False, 'option': False, 'quote': False, 'on_condition': False, 'requires_json': False, 'emits': False}
is_var_len_args = True
output_name: str
119    @property
120    def output_name(self) -> str:
121        return self.expression.output_name if not self.expressions else ""

Name of the output column if this expression is a selection.

If the Expr has no output name, an empty string is returned.

Example:
>>> from sqlglot import parse_one
>>> parse_one("SELECT a").expressions[0].output_name
'a'
>>> parse_one("SELECT b AS c").expressions[0].output_name
'c'
>>> parse_one("SELECT 1 + 2").expressions[0].output_name
''
key: ClassVar[str] = 'jsonextract'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
124class JSONExtractArray(Expression, Func):
125    arg_types = {"this": True, "expression": False}
126    _sql_names = ["JSON_EXTRACT_ARRAY"]
arg_types = {'this': True, 'expression': False}
key: ClassVar[str] = 'jsonextractarray'
required_args: 't.ClassVar[set[str]]' = {'this'}
129class JSONExtractScalar(Expression, Binary, Func):
130    arg_types = {
131        "this": True,
132        "expression": True,
133        "only_json_types": False,
134        "expressions": False,
135        "json_type": False,
136        "scalar_only": False,
137    }
138    _sql_names = ["JSON_EXTRACT_SCALAR"]
139    is_var_len_args = True
140
141    @property
142    def output_name(self) -> str:
143        return self.expression.output_name
arg_types = {'this': True, 'expression': True, 'only_json_types': False, 'expressions': False, 'json_type': False, 'scalar_only': False}
is_var_len_args = True
output_name: str
141    @property
142    def output_name(self) -> str:
143        return self.expression.output_name

Name of the output column if this expression is a selection.

If the Expr has no output name, an empty string is returned.

Example:
>>> from sqlglot import parse_one
>>> parse_one("SELECT a").expressions[0].output_name
'a'
>>> parse_one("SELECT b AS c").expressions[0].output_name
'c'
>>> parse_one("SELECT 1 + 2").expressions[0].output_name
''
key: ClassVar[str] = 'jsonextractscalar'
required_args: 't.ClassVar[set[str]]' = {'expression', 'this'}
146class JSONFormat(Expression, Func):
147    arg_types = {"this": False, "options": False, "is_json": False, "to_json": False}
148    _sql_names = ["JSON_FORMAT"]
arg_types = {'this': False, 'options': False, 'is_json': False, 'to_json': False}
key: ClassVar[str] = 'jsonformat'
required_args: 't.ClassVar[set[str]]' = set()
151class JSONKeys(Expression, Func):
152    arg_types = {"this": True, "expression": False, "expressions": False}
153    is_var_len_args = True
154    _sql_names = ["JSON_KEYS"]
arg_types = {'this': True, 'expression': False, 'expressions': False}
is_var_len_args = True
key: ClassVar[str] = 'jsonkeys'
required_args: 't.ClassVar[set[str]]' = {'this'}
157class JSONKeysAtDepth(Expression, Func):
158    arg_types = {"this": True, "expression": False, "mode": False}
arg_types = {'this': True, 'expression': False, 'mode': False}
key: ClassVar[str] = 'jsonkeysatdepth'
required_args: 't.ClassVar[set[str]]' = {'this'}
161class JSONObject(Expression, Func):
162    arg_types = {
163        "expressions": False,
164        "null_handling": False,
165        "unique_keys": False,
166        "return_type": False,
167        "encoding": False,
168    }
arg_types = {'expressions': False, 'null_handling': False, 'unique_keys': False, 'return_type': False, 'encoding': False}
key: ClassVar[str] = 'jsonobject'
required_args: 't.ClassVar[set[str]]' = set()
171class JSONObjectAgg(Expression, AggFunc):
172    arg_types = {
173        "expressions": False,
174        "null_handling": False,
175        "unique_keys": False,
176        "return_type": False,
177        "encoding": False,
178    }
arg_types = {'expressions': False, 'null_handling': False, 'unique_keys': False, 'return_type': False, 'encoding': False}
key: ClassVar[str] = 'jsonobjectagg'
required_args: 't.ClassVar[set[str]]' = set()
181class JSONRemove(Expression, Func):
182    arg_types = {"this": True, "expressions": True}
183    is_var_len_args = True
184    _sql_names = ["JSON_REMOVE"]
arg_types = {'this': True, 'expressions': True}
is_var_len_args = True
key: ClassVar[str] = 'jsonremove'
required_args: 't.ClassVar[set[str]]' = {'this', 'expressions'}
187class JSONSet(Expression, Func):
188    arg_types = {"this": True, "expressions": True}
189    is_var_len_args = True
190    _sql_names = ["JSON_SET"]
arg_types = {'this': True, 'expressions': True}
is_var_len_args = True
key: ClassVar[str] = 'jsonset'
required_args: 't.ClassVar[set[str]]' = {'this', 'expressions'}
193class JSONStripNulls(Expression, Func):
194    arg_types = {
195        "this": True,
196        "expression": False,
197        "include_arrays": False,
198        "remove_empty": False,
199    }
200    _sql_names = ["JSON_STRIP_NULLS"]
arg_types = {'this': True, 'expression': False, 'include_arrays': False, 'remove_empty': False}
key: ClassVar[str] = 'jsonstripnulls'
required_args: 't.ClassVar[set[str]]' = {'this'}
203class StripNullValue(Expression, Func):
204    pass
key: ClassVar[str] = 'stripnullvalue'
required_args: 't.ClassVar[set[str]]' = {'this'}
207class JSONTable(Expression, Func):
208    arg_types = {
209        "this": True,
210        "schema": True,
211        "path": False,
212        "error_handling": False,
213        "empty_handling": False,
214    }
arg_types = {'this': True, 'schema': True, 'path': False, 'error_handling': False, 'empty_handling': False}
key: ClassVar[str] = 'jsontable'
required_args: 't.ClassVar[set[str]]' = {'schema', 'this'}
217class JSONType(Expression, Func):
218    arg_types = {"this": True, "expression": False}
219    _sql_names = ["JSON_TYPE"]
arg_types = {'this': True, 'expression': False}
key: ClassVar[str] = 'jsontype'
required_args: 't.ClassVar[set[str]]' = {'this'}
222class ObjectId(Expression, Func):
223    arg_types = {"this": True, "expression": False}
arg_types = {'this': True, 'expression': False}
key: ClassVar[str] = 'objectid'
required_args: 't.ClassVar[set[str]]' = {'this'}
226class ObjectInsert(Expression, Func):
227    arg_types = {
228        "this": True,
229        "key": True,
230        "value": True,
231        "update_flag": False,
232    }
arg_types = {'this': True, 'key': True, 'value': True, 'update_flag': False}
key: ClassVar[str] = 'objectinsert'
required_args: 't.ClassVar[set[str]]' = {'key', 'this', 'value'}
235class OpenJSON(Expression, Func):
236    arg_types = {"this": True, "path": False, "expressions": False}
arg_types = {'this': True, 'path': False, 'expressions': False}
key: ClassVar[str] = 'openjson'
required_args: 't.ClassVar[set[str]]' = {'this'}
239class ParseJSON(Expression, Func):
240    # BigQuery, Snowflake have PARSE_JSON, Presto has JSON_PARSE
241    # Snowflake also has TRY_PARSE_JSON, which is represented using `safe`
242    _sql_names = ["PARSE_JSON", "JSON_PARSE"]
243    arg_types = {"this": True, "expression": False, "safe": False}
arg_types = {'this': True, 'expression': False, 'safe': False}
key: ClassVar[str] = 'parsejson'
required_args: 't.ClassVar[set[str]]' = {'this'}