Skip to content

Commit dc3d9b1

Browse files
authored
Merge pull request #1066 from Cali0707/sql-v1-fixes
CESQL v1 fixes
2 parents 8efefb0 + 3ce6b2f commit dc3d9b1

37 files changed

+505
-221
lines changed

sql/v2/CESQLLexer.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ FALSE: 'FALSE';
7070

7171
DQUOTED_STRING_LITERAL: DQUOTA_STRING;
7272
SQUOTED_STRING_LITERAL: SQUOTA_STRING;
73-
INTEGER_LITERAL: INT_DIGIT+;
73+
INTEGER_LITERAL: ('+' | '-')? INT_DIGIT+;
7474

7575
// Identifiers
7676

sql/v2/errors/errors.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
/*
2+
Copyright 2024 The CloudEvents Authors
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package errors
7+
8+
import (
9+
"fmt"
10+
"strings"
11+
)
12+
13+
type errorKind int
14+
15+
const (
16+
parseError = iota
17+
mathError
18+
castError
19+
missingAttributeError
20+
missingFunctionError
21+
functionEvaluationError
22+
dummyLastError // always add new error classes ABOVE this error
23+
)
24+
25+
type cesqlError struct {
26+
kind errorKind
27+
message string
28+
}
29+
30+
func (eKind errorKind) String() string {
31+
switch eKind {
32+
case parseError:
33+
return "parse error"
34+
case mathError:
35+
return "math error"
36+
case castError:
37+
return "cast error"
38+
case missingAttributeError:
39+
return "missing attribute error"
40+
case missingFunctionError:
41+
return "missing function error"
42+
case functionEvaluationError:
43+
return "function evaluation error"
44+
default:
45+
return "generic error"
46+
}
47+
48+
}
49+
50+
func (cerr cesqlError) Error() string {
51+
return fmt.Sprintf("%s: %s", cerr.kind, cerr.message)
52+
}
53+
54+
func NewParseError(errs []error) error {
55+
if len(errs) == 0 {
56+
return nil
57+
}
58+
59+
errorMessages := make([]string, 0, len(errs))
60+
for _, err := range errs {
61+
errorMessages = append(errorMessages, err.Error())
62+
}
63+
64+
return cesqlError{
65+
kind: parseError,
66+
message: strings.Join(errorMessages, "|"),
67+
}
68+
}
69+
70+
func IsParseError(err error) bool {
71+
if cesqlErr, ok := err.(cesqlError); ok {
72+
return cesqlErr.kind == parseError
73+
}
74+
return false
75+
}
76+
77+
func IsMathError(err error) bool {
78+
if cesqlErr, ok := err.(cesqlError); ok {
79+
return cesqlErr.kind == mathError
80+
}
81+
return false
82+
}
83+
84+
func NewMathError(message string) error {
85+
return cesqlError{
86+
kind: mathError,
87+
message: message,
88+
}
89+
}
90+
91+
func IsCastError(err error) bool {
92+
if cesqlErr, ok := err.(cesqlError); ok {
93+
return cesqlErr.kind == castError
94+
}
95+
return false
96+
}
97+
98+
func NewCastError(err error) error {
99+
return cesqlError{
100+
kind: castError,
101+
message: err.Error(),
102+
}
103+
}
104+
105+
func IsMissingAttributeError(err error) bool {
106+
if cesqlErr, ok := err.(cesqlError); ok {
107+
return cesqlErr.kind == missingAttributeError
108+
}
109+
return false
110+
}
111+
112+
func NewMissingAttributeError(attribute string) error {
113+
return cesqlError{
114+
kind: missingAttributeError,
115+
message: attribute,
116+
}
117+
}
118+
119+
func IsMissingFunctionError(err error) bool {
120+
if cesqlErr, ok := err.(cesqlError); ok {
121+
return cesqlErr.kind == missingFunctionError
122+
}
123+
return false
124+
}
125+
126+
func NewMissingFunctionError(function string) error {
127+
return cesqlError{
128+
kind: missingFunctionError,
129+
message: function,
130+
}
131+
}
132+
133+
func IsFunctionEvaluationError(err error) bool {
134+
if cesqlErr, ok := err.(cesqlError); ok {
135+
return cesqlErr.kind == functionEvaluationError
136+
}
137+
return false
138+
}
139+
140+
func NewFunctionEvaluationError(err error) error {
141+
return cesqlError{
142+
kind: functionEvaluationError,
143+
message: err.Error(),
144+
}
145+
}
146+
147+
func IsGenericError(err error) bool {
148+
if cesqlErr, ok := err.(cesqlError); ok {
149+
return cesqlErr.kind < 0 || cesqlErr.kind >= dummyLastError
150+
}
151+
return false
152+
}

sql/v2/expression/comparison_expressions.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ type equalExpression struct {
1919
func (s equalExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2020
leftVal, err := s.left.Evaluate(event)
2121
if err != nil {
22-
return nil, err
22+
return false, err
2323
}
2424

2525
rightVal, err := s.right.Evaluate(event)
2626
if err != nil {
27-
return nil, err
27+
return false, err
2828
}
2929

3030
leftVal, err = utils.Cast(leftVal, cesql.TypeFromVal(rightVal))
3131
if err != nil {
32-
return nil, err
32+
return false, err
3333
}
3434

3535
return (leftVal == rightVal) == s.equal, nil

sql/v2/expression/function_invocation_expression.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010

1111
cesql "github.com/cloudevents/sdk-go/sql/v2"
12+
sqlerrors "github.com/cloudevents/sdk-go/sql/v2/errors"
1213
"github.com/cloudevents/sdk-go/sql/v2/runtime"
1314
"github.com/cloudevents/sdk-go/sql/v2/utils"
1415
cloudevents "github.com/cloudevents/sdk-go/v2"
@@ -22,31 +23,44 @@ type functionInvocationExpression struct {
2223
func (expr functionInvocationExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2324
fn := runtime.ResolveFunction(expr.name, len(expr.argumentsExpression))
2425
if fn == nil {
25-
return nil, fmt.Errorf("cannot resolve function %s", expr.name)
26+
return false, sqlerrors.NewMissingFunctionError(expr.name)
2627
}
2728

2829
args := make([]interface{}, len(expr.argumentsExpression))
2930

31+
defaultVal := fn.ReturnType().ZeroValue()
32+
3033
for i, expr := range expr.argumentsExpression {
3134
arg, err := expr.Evaluate(event)
3235
if err != nil {
33-
return nil, err
36+
return defaultVal, err
3437
}
3538

3639
argType := fn.ArgType(i)
3740
if argType == nil {
38-
return nil, fmt.Errorf("cannot resolve arg type at index %d", i)
41+
return defaultVal, sqlerrors.NewFunctionEvaluationError(fmt.Errorf("cannot resolve arg type at index %d for function %s", i, fn.Name()))
3942
}
4043

4144
arg, err = utils.Cast(arg, *argType)
4245
if err != nil {
43-
return nil, err
46+
return defaultVal, err
4447
}
4548

4649
args[i] = arg
4750
}
4851

49-
return fn.Run(event, args)
52+
result, err := fn.Run(event, args)
53+
if result == nil {
54+
if err != nil {
55+
err = sqlerrors.NewFunctionEvaluationError(fmt.Errorf("function %s encountered error %w and did not return any value, defaulting to the default value for the function", fn.Name(), err))
56+
} else {
57+
err = sqlerrors.NewFunctionEvaluationError(fmt.Errorf("function %s did not return any value, defaulting to the default value for the function", fn.Name()))
58+
}
59+
60+
return defaultVal, err
61+
}
62+
63+
return result, err
5064
}
5165

5266
func NewFunctionInvocationExpression(name string, argumentsExpression []cesql.Expression) cesql.Expression {

sql/v2/expression/identifier_expression.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
package expression
77

88
import (
9-
"fmt"
10-
119
cesql "github.com/cloudevents/sdk-go/sql/v2"
10+
sqlerrors "github.com/cloudevents/sdk-go/sql/v2/errors"
1211
"github.com/cloudevents/sdk-go/sql/v2/utils"
1312
cloudevents "github.com/cloudevents/sdk-go/v2"
1413
)
@@ -20,7 +19,7 @@ type identifierExpression struct {
2019
func (l identifierExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2120
value := utils.GetAttribute(event, l.identifier)
2221
if value == nil {
23-
return nil, fmt.Errorf("missing attribute '%s'", l.identifier)
22+
return false, sqlerrors.NewMissingAttributeError(l.identifier)
2423
}
2524

2625
return value, nil

sql/v2/expression/in_expression.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@ type inExpression struct {
1919
func (l inExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2020
leftValue, err := l.leftExpression.Evaluate(event)
2121
if err != nil {
22-
return nil, err
22+
return false, err
2323
}
2424

2525
for _, rightExpression := range l.setExpression {
2626
rightValue, err := rightExpression.Evaluate(event)
2727
if err != nil {
28-
return nil, err
28+
return false, err
2929
}
3030

3131
rightValue, err = utils.Cast(rightValue, cesql.TypeFromVal(leftValue))
3232
if err != nil {
33-
return nil, err
33+
return false, err
3434
}
3535

3636
if leftValue == rightValue {

sql/v2/expression/integer_comparison_expressions.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@ type integerComparisonExpression struct {
1919
func (s integerComparisonExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2020
leftVal, err := s.left.Evaluate(event)
2121
if err != nil {
22-
return nil, err
22+
return false, err
2323
}
2424

2525
rightVal, err := s.right.Evaluate(event)
2626
if err != nil {
27-
return nil, err
27+
return false, err
2828
}
2929

3030
leftVal, err = utils.Cast(leftVal, cesql.IntegerType)
3131
if err != nil {
32-
return nil, err
32+
return false, err
3333
}
3434

3535
rightVal, err = utils.Cast(rightVal, cesql.IntegerType)
3636
if err != nil {
37-
return nil, err
37+
return false, err
3838
}
3939

4040
return s.fn(leftVal.(int32), rightVal.(int32)), nil

sql/v2/expression/like_expression.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ type likeExpression struct {
1919
func (l likeExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2020
val, err := l.child.Evaluate(event)
2121
if err != nil {
22-
return nil, err
22+
return false, err
2323
}
2424

2525
val, err = utils.Cast(val, cesql.StringType)
2626
if err != nil {
27-
return nil, err
27+
return false, err
2828
}
2929

3030
return matchString(val.(string), l.pattern), nil

sql/v2/expression/logic_expressions.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ type logicExpression struct {
2020
func (s logicExpression) Evaluate(event cloudevents.Event) (interface{}, error) {
2121
leftVal, err := s.left.Evaluate(event)
2222
if err != nil {
23-
return nil, err
23+
return false, err
2424
}
2525

2626
leftVal, err = utils.Cast(leftVal, cesql.BooleanType)
2727
if err != nil {
28-
return nil, err
28+
return false, err
2929
}
3030

3131
// Don't bother to check the other expression unless we need to
@@ -38,12 +38,12 @@ func (s logicExpression) Evaluate(event cloudevents.Event) (interface{}, error)
3838

3939
rightVal, err := s.right.Evaluate(event)
4040
if err != nil {
41-
return nil, err
41+
return false, err
4242
}
4343

4444
rightVal, err = utils.Cast(rightVal, cesql.BooleanType)
4545
if err != nil {
46-
return nil, err
46+
return false, err
4747
}
4848

4949
return s.fn(leftVal.(bool), rightVal.(bool)), nil

0 commit comments

Comments
 (0)