From d196b789e2edd6a5a893363ad9e19c91e14b0710 Mon Sep 17 00:00:00 2001 From: Kyle Brandt Date: Fri, 7 Feb 2025 04:44:17 -0500 Subject: [PATCH] SQL Expressions: Add more SQLNodes and funcs to allow list (#100227) sql_expr: Add more Nodes and funcs to allow list --- pkg/expr/sql/parser_allow.go | 17 ++++++++++++++++- pkg/expr/sql/parser_allow_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/pkg/expr/sql/parser_allow.go b/pkg/expr/sql/parser_allow.go index 8a2ad436920..54072049253 100644 --- a/pkg/expr/sql/parser_allow.go +++ b/pkg/expr/sql/parser_allow.go @@ -54,7 +54,13 @@ func allowedNode(node sqlparser.SQLNode) (b bool) { case *sqlparser.AliasedExpr, *sqlparser.AliasedTableExpr: return - case *sqlparser.BinaryExpr: + case *sqlparser.AndExpr, *sqlparser.OrExpr: + return + + case *sqlparser.BinaryExpr, *sqlparser.UnaryExpr: + return + + case sqlparser.BoolVal: return case sqlparser.ColIdent, *sqlparser.ColName, sqlparser.Columns: @@ -87,6 +93,9 @@ func allowedNode(node sqlparser.SQLNode) (b bool) { case *sqlparser.Select, sqlparser.SelectExprs: return + case *sqlparser.SetOp: + return + case *sqlparser.StarExpr: return @@ -102,6 +111,9 @@ func allowedNode(node sqlparser.SQLNode) (b bool) { case *sqlparser.Over: return + case *sqlparser.ParenExpr: + return + case *sqlparser.Subquery: 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 switch strings.ToLower(f.Name.String()) { + case "if": + return + case "sum", "avg", "count", "min", "max": return diff --git a/pkg/expr/sql/parser_allow_test.go b/pkg/expr/sql/parser_allow_test.go index aeeb1a40c69..98dd3277173 100644 --- a/pkg/expr/sql/parser_allow_test.go +++ b/pkg/expr/sql/parser_allow_test.go @@ -17,6 +17,11 @@ func TestAllowQuery(t *testing.T) { q: example_metrics_query, err: nil, }, + { + name: "an example from todd", + q: example_argo_commit_example, + err: nil, + }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { @@ -78,3 +83,29 @@ SELECT * FROM usage_by_team CROSS JOIN total_metrics 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;`