diff --git a/pkg/expr/sql/parser.go b/pkg/expr/sql/parser.go index 12269b4a68f..c65e4b89131 100644 --- a/pkg/expr/sql/parser.go +++ b/pkg/expr/sql/parser.go @@ -14,7 +14,7 @@ var logger = log.New("sql_expr") func TablesList(rawSQL string) ([]string, error) { stmt, err := sqlparser.Parse(rawSQL) if err != nil { - logger.Error("error parsing sql: %s", err.Error(), "sql", rawSQL) + logger.Error("error parsing sql", "error", err.Error(), "sql", rawSQL) return nil, fmt.Errorf("error parsing sql: %s", err.Error()) } diff --git a/pkg/expr/sql_command.go b/pkg/expr/sql_command.go index 0b4d7ab698e..8bcde6abb9b 100644 --- a/pkg/expr/sql_command.go +++ b/pkg/expr/sql_command.go @@ -14,6 +14,16 @@ import ( "github.com/grafana/grafana/pkg/infra/tracing" ) +var ( + ErrMissingSQLQuery = errutil.BadRequest("sql-missing-query").Errorf("missing SQL query") + ErrInvalidSQLQuery = errutil.BadRequest("sql-invalid-sql").MustTemplate( + "invalid SQL query: {{ .Private.query }} err: {{ .Error }}", + errutil.WithPublic( + "Invalid SQL query: {{ .Public.error }}", + ), + ) +) + // SQLCommand is an expression to run SQL over results type SQLCommand struct { query string @@ -25,15 +35,20 @@ type SQLCommand struct { // NewSQLCommand creates a new SQLCommand. func NewSQLCommand(refID, rawSQL string, limit int64) (*SQLCommand, error) { if rawSQL == "" { - return nil, errutil.BadRequest("sql-missing-query", - errutil.WithPublicMessage("missing SQL query")) + return nil, ErrMissingSQLQuery } tables, err := sql.TablesList(rawSQL) if err != nil { logger.Warn("invalid sql query", "sql", rawSQL, "error", err) - return nil, errutil.BadRequest("sql-invalid-sql", - errutil.WithPublicMessage(fmt.Sprintf("invalid SQL query: %s", err)), - ) + return nil, ErrInvalidSQLQuery.Build(errutil.TemplateData{ + Error: err, + Public: map[string]any{ + "error": err.Error(), + }, + Private: map[string]any{ + "query": rawSQL, + }, + }) } if len(tables) == 0 { logger.Warn("no tables found in SQL query", "sql", rawSQL)