Skip to content

Commit e617d40

Browse files
Feat!: extend ANALYZE common syntax to cover multiple dialects (#4591)
* Extend ANALYZE common syntax to cover multiple dialects * Support starrocks and redshift * parse VALIDATE and SAMPLE statements * Parse oracle ANALYZE LIST and ANALYZE DELETE * Fix analyze list chained rows type hint * Fix analyze with type hint * Simplify generator logic (1) * Simplify generator logic (2) --------- Co-authored-by: Jo <[email protected]>
1 parent b7ab3f1 commit e617d40

17 files changed

+412
-65
lines changed

sqlglot/expressions.py

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4718,20 +4718,75 @@ def actions(self) -> t.List[Expression]:
47184718

47194719
class Analyze(Expression):
47204720
arg_types = {
4721-
"kind": True,
4721+
"kind": False,
47224722
"this": False,
4723+
"options": False,
4724+
"mode": False,
47234725
"partition": False,
4724-
"expression": True,
4726+
"expression": False,
4727+
"properties": False,
47254728
}
47264729

47274730

4728-
class ComputeStatistics(Expression):
4731+
class Statistics(Expression):
47294732
arg_types = {
4733+
"kind": True,
4734+
"option": False,
47304735
"this": False,
47314736
"expressions": False,
47324737
}
47334738

47344739

4740+
class Histogram(Expression):
4741+
arg_types = {
4742+
"this": True,
4743+
"expressions": True,
4744+
"expression": False,
4745+
"update_options": False,
4746+
}
4747+
4748+
4749+
class Sample(Expression):
4750+
arg_types = {
4751+
"kind": True,
4752+
"sample": True,
4753+
}
4754+
4755+
4756+
class AnalyzeListChainedRows(Expression):
4757+
arg_types = {
4758+
"expression": False,
4759+
}
4760+
4761+
4762+
class AnalyzeDelete(Expression):
4763+
arg_types = {
4764+
"kind": False,
4765+
}
4766+
4767+
4768+
class AnalyzeWith(Expression):
4769+
arg_types = {
4770+
"expressions": True,
4771+
}
4772+
4773+
4774+
class AnalyzeValidate(Expression):
4775+
arg_types = {
4776+
"kind": True,
4777+
"this": False,
4778+
"expression": False,
4779+
}
4780+
4781+
4782+
class AnalyzeColumns(Expression):
4783+
pass
4784+
4785+
4786+
class UsingData(Expression):
4787+
pass
4788+
4789+
47354790
class AddConstraint(Expression):
47364791
arg_types = {"expressions": True}
47374792

sqlglot/generator.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4656,22 +4656,72 @@ def unpivotcolumns_sql(self, expression: exp.UnpivotColumns) -> str:
46564656

46574657
return f"NAME {name} VALUE {values}"
46584658

4659-
def computestatistics_sql(self, expression: exp.ComputeStatistics) -> str:
4659+
def sample_sql(self, expression: exp.Sample) -> str:
4660+
kind = self.sql(expression, "kind")
4661+
sample = self.sql(expression, "sample")
4662+
return f"SAMPLE {sample} {kind}"
4663+
4664+
def statistics_sql(self, expression: exp.Statistics) -> str:
4665+
kind = self.sql(expression, "kind")
4666+
option = self.sql(expression, "option")
4667+
option = f" {option}" if option else ""
46604668
this = self.sql(expression, "this")
4669+
this = f" {this}" if this else ""
46614670
columns = self.expressions(expression)
46624671
columns = f" {columns}" if columns else ""
4663-
return f"COMPUTE STATISTICS {this}{columns}"
4672+
return f"{kind}{option} STATISTICS{this}{columns}"
4673+
4674+
def histogram_sql(self, expression: exp.Histogram) -> str:
4675+
this = self.sql(expression, "this")
4676+
columns = self.expressions(expression)
4677+
inner_expression = self.sql(expression, "expression")
4678+
inner_expression = f" {inner_expression}" if inner_expression else ""
4679+
update_options = self.sql(expression, "update_options")
4680+
update_options = f" {update_options} UPDATE" if update_options else ""
4681+
return f"{this} HISTOGRAM ON {columns}{inner_expression}{update_options}"
4682+
4683+
def usingdata_sql(self, expression: exp.UsingData) -> str:
4684+
data = self.sql(expression, "this")
4685+
return f"USING DATA {data}"
4686+
4687+
def analyzecolumns_sql(self, expression: exp.AnalyzeColumns) -> str:
4688+
return self.sql(expression, "this")
4689+
4690+
def analyzedelete_sql(self, expression: exp.AnalyzeDelete) -> str:
4691+
kind = self.sql(expression, "kind")
4692+
kind = f" {kind}" if kind else ""
4693+
return f"DELETE{kind} STATISTICS"
4694+
4695+
def analyzewith_sql(self, expression: exp.AnalyzeWith) -> str:
4696+
return self.expressions(expression, prefix="WITH ", sep=" ")
4697+
4698+
def analyzelistchainedrows_sql(self, expression: exp.AnalyzeListChainedRows) -> str:
4699+
inner_expression = self.sql(expression, "expression")
4700+
return f"LIST CHAINED ROWS{inner_expression}"
4701+
4702+
def analyzevalidate_sql(self, expression: exp.AnalyzeValidate) -> str:
4703+
kind = self.sql(expression, "kind")
4704+
this = self.sql(expression, "this")
4705+
this = f" {this}" if this else ""
4706+
inner_expression = self.sql(expression, "expression")
4707+
return f"VALIDATE {kind}{this}{inner_expression}"
46644708

46654709
def analyze_sql(self, expression: exp.Analyze) -> str:
4710+
options = self.expressions(expression, key="options", sep=" ")
4711+
options = f" {options}" if options else ""
46664712
kind = self.sql(expression, "kind")
4713+
kind = f" {kind}" if kind else ""
46674714
this = self.sql(expression, "this")
46684715
this = f" {this}" if this else ""
4669-
if this and kind == "TABLES":
4670-
this = f" FROM{this}"
4716+
mode = self.sql(expression, "mode")
4717+
mode = f" {mode}" if mode else ""
4718+
properties = self.sql(expression, "properties")
4719+
properties = f" {properties}" if properties else ""
46714720
partition = self.sql(expression, "partition")
46724721
partition = f" {partition}" if partition else ""
4673-
inner_expression = f" {self.sql(expression, 'expression')}"
4674-
return f"ANALYZE {kind}{this}{partition}{inner_expression}"
4722+
inner_expression = self.sql(expression, "expression")
4723+
inner_expression = f" {inner_expression}" if inner_expression else ""
4724+
return f"ANALYZE{options}{kind}{this}{partition}{mode}{inner_expression}{properties}"
46754725

46764726
def xmltable_sql(self, expression: exp.XMLTable) -> str:
46774727
this = self.sql(expression, "this")

0 commit comments

Comments
 (0)