Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix: fixed issue 4332, now type checks for consistency when the same …
…parameter is repeated
  • Loading branch information
qykr committed Mar 10, 2026
commit bd77a020698a425099c9e50d784fd63fa2f9d122
13 changes: 10 additions & 3 deletions internal/compiler/analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,18 @@ func (c *Compiler) _analyzeQuery(raw *ast.RawStmt, query string, failfast bool)
}
errors = append(errors, errs...)
}
refs = uniqueParamRefs(refs, dollar)
refs = numberParamRefs(refs, dollar)
if c.conf.Engine == config.EngineMySQL || !dollar {
sort.Slice(refs, func(i, j int) bool { return refs[i].ref.Location < refs[j].ref.Location })
sort.SliceStable(refs, func(i, j int) bool {
return refs[i].ref.Location < refs[j].ref.Location
})
} else {
sort.Slice(refs, func(i, j int) bool { return refs[i].ref.Number < refs[j].ref.Number })
sort.SliceStable(refs, func(i, j int) bool {
if refs[i].ref.Number == refs[j].ref.Number {
return refs[i].ref.Location < refs[j].ref.Location
}
return refs[i].ref.Number < refs[j].ref.Number
})
}
raw, embeds := rewrite.Embeds(raw)
qc, err := c.buildQueryCatalog(c.catalog, raw.Stmt, embeds)
Expand Down
47 changes: 24 additions & 23 deletions internal/compiler/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,28 +193,29 @@ func rangeVars(root ast.Node) []*ast.RangeVar {
return vars
}

func uniqueParamRefs(in []paramRef, dollar bool) []paramRef {
m := make(map[int]bool, len(in))
o := make([]paramRef, 0, len(in))
func numberParamRefs(in []paramRef, dollar bool) []paramRef {
if dollar {
return in
}

used := make(map[int]bool, len(in))
for _, v := range in {
if !m[v.ref.Number] {
m[v.ref.Number] = true
if v.ref.Number != 0 {
o = append(o, v)
}
}
}
if !dollar {
start := 1
for _, v := range in {
if v.ref.Number == 0 {
for m[start] {
start++
}
v.ref.Number = start
o = append(o, v)
}
}
}
return o
if v.ref.Number != 0 {
used[v.ref.Number] = true
}
}

start := 1
for i := range in {
if in[i].ref.Number != 0 {
continue
}
for used[start] {
start++
}
in[i].ref.Number = start
used[start] = true
}

return in
}
Loading
Loading