@@ -15,9 +15,11 @@ type ParsedDqlQuery struct {
15
15
inputSql string
16
16
ast * chparser.SelectQuery
17
17
18
- paramSet * ParamSlotSet
19
- paramSetErr error
20
- noParams bool
18
+ paramBindEnv * ParamBindEnv
19
+
20
+ paramSlotSet * ParamSlotSet
21
+ paramSlotSetErr error
22
+ noParams bool
21
23
}
22
24
23
25
func (inst * ParsedDqlQuery ) String () string {
@@ -26,34 +28,44 @@ func (inst *ParsedDqlQuery) String() string {
26
28
func (inst * ParsedDqlQuery ) GetAst () * chparser.SelectQuery {
27
29
return inst .ast
28
30
}
31
+ func (inst * ParsedDqlQuery ) GetParamBindEnv () (paramBindEnv * ParamBindEnv ) {
32
+ if inst .paramBindEnv .IsEmpty () {
33
+ return nil
34
+ }
35
+ return inst .paramBindEnv
36
+ }
29
37
func (inst * ParsedDqlQuery ) GetParamSlotSet () (paramSet * ParamSlotSet , err error ) {
30
38
if inst .noParams {
31
39
return
32
40
}
33
- if inst .paramSet == nil && inst .paramSetErr == nil {
41
+ if inst .paramSlotSet == nil && inst .paramSlotSetErr == nil {
34
42
ps := NewParamSlotsSet ()
35
43
d := newParamSlotsDiscoverer ()
36
44
err = d .discover (inst .ast , ps )
37
45
if err != nil {
38
46
err = eh .Errorf ("error while discovering paramset: %w" , err )
39
- inst .paramSetErr = err
47
+ inst .paramSlotSetErr = err
40
48
return
41
49
}
42
50
if ps .IsEmpty () {
43
51
inst .noParams = true
44
52
ps = nil
45
53
}
46
- inst .paramSet = ps
54
+ inst .paramSlotSet = ps
47
55
}
48
- paramSet = inst .paramSet
49
- err = inst .paramSetErr
56
+ paramSet = inst .paramSlotSet
57
+ err = inst .paramSlotSetErr
50
58
return
51
59
}
52
60
53
61
func NewParsedDqlQuery (sql string ) (inst * ParsedDqlQuery , err error ) {
54
62
inst = & ParsedDqlQuery {
55
- inputSql : sql ,
56
- ast : nil ,
63
+ inputSql : sql ,
64
+ ast : nil ,
65
+ paramBindEnv : NewParamBindEnv (),
66
+ paramSlotSet : nil ,
67
+ paramSlotSetErr : nil ,
68
+ noParams : false ,
57
69
}
58
70
err = inst .parse ()
59
71
if err != nil {
@@ -62,22 +74,33 @@ func NewParsedDqlQuery(sql string) (inst *ParsedDqlQuery, err error) {
62
74
}
63
75
return
64
76
}
65
- func removeParamSettingsFromExprs (exprs []chparser.Expr ) (exprsOut []chparser.Expr ) {
77
+ func (inst * ParsedDqlQuery ) removeParamSettingsFromExprs (exprs []chparser.Expr ) (exprsOut []chparser.Expr , err error ) {
78
+ const paramPrefixName = "param_" // Note: param names are case-sensitive
79
+ bindEnv := inst .paramBindEnv
66
80
for _ , expr := range exprs {
67
81
switch exprt := expr .(type ) {
68
82
case * chparser.SetStmt :
69
- items := slices . DeleteFunc ( exprt .Settings .Items , func ( list * chparser. SettingExprList ) bool {
83
+ for _ , list := range exprt .Settings .Items {
70
84
name := list .Name .Name
71
- if strings .HasPrefix (list .Name .Name , "param_" ) {
72
- log .Info ().Str ("name" , name ).Msg ("removing set param value expression" )
73
- return true
85
+ if strings .HasPrefix (name , paramPrefixName ) {
86
+ if bindEnv != nil {
87
+ err = bindEnv .AddDistinct (list )
88
+ if err != nil {
89
+ return
90
+ }
91
+ } else {
92
+ log .Info ().Str ("name" , name ).Msg ("removing set param value expression" )
93
+ }
74
94
}
75
- return false
95
+ }
96
+ exprt .Settings .Items = slices .DeleteFunc (exprt .Settings .Items , func (list * chparser.SettingExprList ) bool {
97
+ name := list .Name .Name
98
+ return strings .HasPrefix (name , paramPrefixName )
76
99
})
77
- exprt .Settings .Items = items
78
100
break
79
101
}
80
102
}
103
+
81
104
exprsOut = slices .DeleteFunc (exprs , func (expr chparser.Expr ) bool {
82
105
switch exprt := expr .(type ) {
83
106
case * chparser.SetStmt :
@@ -96,7 +119,11 @@ func (inst *ParsedDqlQuery) parse() (err error) {
96
119
return
97
120
}
98
121
99
- exprs = removeParamSettingsFromExprs (exprs )
122
+ exprs , err = inst .removeParamSettingsFromExprs (exprs )
123
+ if err != nil {
124
+ err = eh .Errorf ("unable to remove param settings from expressions: %w" , err )
125
+ return
126
+ }
100
127
if len (exprs ) != 1 {
101
128
err = eb .Build ().Int ("nExprs" , len (exprs )).Errorf ("sql must contain exactly on expression" )
102
129
return
0 commit comments