mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 15:22:08 +08:00
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:
@ -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
|
||||||
|
|
||||||
|
@ -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;`
|
||||||
|
Reference in New Issue
Block a user