SQL Expressions: Add more SQLNodes and funcs to allow list (#100227)

sql_expr: Add more Nodes and funcs to allow list
This commit is contained in:
Kyle Brandt
2025-02-07 04:44:17 -05:00
committed by GitHub
parent d62c490af5
commit d196b789e2
2 changed files with 47 additions and 1 deletions

View File

@ -54,7 +54,13 @@ func allowedNode(node sqlparser.SQLNode) (b bool) {
case *sqlparser.AliasedExpr, *sqlparser.AliasedTableExpr: case *sqlparser.AliasedExpr, *sqlparser.AliasedTableExpr:
return return
case *sqlparser.BinaryExpr: case *sqlparser.AndExpr, *sqlparser.OrExpr:
return
case *sqlparser.BinaryExpr, *sqlparser.UnaryExpr:
return
case sqlparser.BoolVal:
return return
case sqlparser.ColIdent, *sqlparser.ColName, sqlparser.Columns: case sqlparser.ColIdent, *sqlparser.ColName, sqlparser.Columns:
@ -87,6 +93,9 @@ func allowedNode(node sqlparser.SQLNode) (b bool) {
case *sqlparser.Select, sqlparser.SelectExprs: case *sqlparser.Select, sqlparser.SelectExprs:
return return
case *sqlparser.SetOp:
return
case *sqlparser.StarExpr: case *sqlparser.StarExpr:
return return
@ -102,6 +111,9 @@ func allowedNode(node sqlparser.SQLNode) (b bool) {
case *sqlparser.Over: case *sqlparser.Over:
return return
case *sqlparser.ParenExpr:
return
case *sqlparser.Subquery: case *sqlparser.Subquery:
return return
@ -124,6 +136,9 @@ func allowedFunction(f *sqlparser.FuncExpr) (b bool) {
b = true // so don't have to return true in every case but default b = true // so don't have to return true in every case but default
switch strings.ToLower(f.Name.String()) { switch strings.ToLower(f.Name.String()) {
case "if":
return
case "sum", "avg", "count", "min", "max": case "sum", "avg", "count", "min", "max":
return return

View File

@ -17,6 +17,11 @@ func TestAllowQuery(t *testing.T) {
q: example_metrics_query, q: example_metrics_query,
err: nil, err: nil,
}, },
{
name: "an example from todd",
q: example_argo_commit_example,
err: nil,
},
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
@ -78,3 +83,29 @@ SELECT *
FROM usage_by_team FROM usage_by_team
CROSS JOIN total_metrics CROSS JOIN total_metrics
CROSS JOIN total_traces` CROSS JOIN total_traces`
var example_argo_commit_example = `WITH
gh AS
(SELECT Count(*) AS commits
FROM
(SELECT *
FROM oss_repo
UNION ALL SELECT *
FROM ent_repo) AS ent_repos),
argo_success AS
(SELECT IF(argo.status = 'Succeeded', argo.value, 0) AS value FROM argo),
argo_failure AS
(SELECT IF(argo.status = 'Failed', argo.value, 0) AS value FROM argo)
SELECT IF(env.value > 1, TRUE, workflows.runs < 1 OR gh.commits < 1) AS status,
gh.commits AS 'merged commits to main (OSS + enterprise)',
drone.value AS 'enterprise downstream publish',
workflows.runs AS 'github trigger instant workflow runs today',
argo_success.value AS 'argo success',
argo_failure.value AS 'argo failure',
(env.value - 1) AS 'new dev instant deployments'
FROM drone,
env,
gh,
argo_success,
argo_failure,
workflows;`