summaryrefslogtreecommitdiffstats
path: root/sqlglot/expressions.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sqlglot/expressions.py67
1 files changed, 58 insertions, 9 deletions
diff --git a/sqlglot/expressions.py b/sqlglot/expressions.py
index 877e9fd..98afddc 100644
--- a/sqlglot/expressions.py
+++ b/sqlglot/expressions.py
@@ -20,6 +20,7 @@ import typing as t
from collections import deque
from copy import deepcopy
from enum import auto
+from functools import reduce
from sqlglot._typing import E
from sqlglot.errors import ParseError
@@ -1170,7 +1171,7 @@ class Column(Condition):
parts.append(parent.expression)
parent = parent.parent
- return Dot.build(parts)
+ return Dot.build(deepcopy(parts))
class ColumnPosition(Expression):
@@ -1537,6 +1538,10 @@ class ForeignKey(Expression):
}
+class ColumnPrefix(Expression):
+ arg_types = {"this": True, "expression": True}
+
+
class PrimaryKey(Expression):
arg_types = {"expressions": True, "options": False}
@@ -3529,6 +3534,8 @@ class DataType(Expression):
STRUCT = auto()
SUPER = auto()
TEXT = auto()
+ TINYBLOB = auto()
+ TINYTEXT = auto()
TIME = auto()
TIMETZ = auto()
TIMESTAMP = auto()
@@ -3793,13 +3800,7 @@ class Dot(Binary):
if len(expressions) < 2:
raise ValueError(f"Dot requires >= 2 expressions.")
- a, b, *expressions = expressions
- dot = Dot(this=a, expression=b)
-
- for expression in expressions:
- dot = Dot(this=dot, expression=expression)
-
- return dot
+ return t.cast(Dot, reduce(lambda x, y: Dot(this=x, expression=y), expressions))
class DPipe(Binary):
@@ -3959,6 +3960,13 @@ class Between(Predicate):
class Bracket(Condition):
arg_types = {"this": True, "expressions": True}
+ @property
+ def output_name(self) -> str:
+ if len(self.expressions) == 1:
+ return self.expressions[0].output_name
+
+ return super().output_name
+
class SafeBracket(Bracket):
"""Represents array lookup where OOB index yields NULL instead of causing a failure."""
@@ -4477,6 +4485,10 @@ class IsNan(Func):
_sql_names = ["IS_NAN", "ISNAN"]
+class FormatJson(Expression):
+ pass
+
+
class JSONKeyValue(Expression):
arg_types = {"this": True, "expression": True}
@@ -4487,11 +4499,48 @@ class JSONObject(Func):
"null_handling": False,
"unique_keys": False,
"return_type": False,
- "format_json": False,
"encoding": False,
}
+# https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_ARRAY.html
+class JSONArray(Func):
+ arg_types = {
+ "expressions": True,
+ "null_handling": False,
+ "return_type": False,
+ "strict": False,
+ }
+
+
+# https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_ARRAYAGG.html
+class JSONArrayAgg(Func):
+ arg_types = {
+ "this": True,
+ "order": False,
+ "null_handling": False,
+ "return_type": False,
+ "strict": False,
+ }
+
+
+# https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_TABLE.html
+# Note: parsing of JSON column definitions is currently incomplete.
+class JSONColumnDef(Expression):
+ arg_types = {"this": True, "kind": False, "path": False}
+
+
+# # https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_TABLE.html
+class JSONTable(Func):
+ arg_types = {
+ "this": True,
+ "expressions": True,
+ "path": False,
+ "error_handling": False,
+ "empty_handling": False,
+ }
+
+
class OpenJSONColumnDef(Expression):
arg_types = {"this": True, "kind": True, "path": False, "as_json": False}