fix: use numeric comparison for MIN/MAX aggregates
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled

This commit is contained in:
2026-05-19 15:19:47 +03:00
parent cd46edcb67
commit d3b77174da
+24 -6
View File
@@ -24,6 +24,24 @@ import ../storage/wal
import ../core/mvcc import ../core/mvcc
import ../core/tracing import ../core/tracing
import ../fts/engine as fts import ../fts/engine as fts
proc cmpMax(a, b: string): bool =
var fa, fb: float
try:
fa = parseFloat(a)
fb = parseFloat(b)
result = fa > fb
except ValueError:
result = a > b
proc cmpMin(a, b: string): bool =
var fa, fb: float
try:
fa = parseFloat(a)
fb = parseFloat(b)
result = fa < fb
except ValueError:
result = a < b
import ../vector/engine as vengine import ../vector/engine as vengine
import ../graph/engine as gengine import ../graph/engine as gengine
import ../graph/community as gcomm import ../graph/community as gcomm
@@ -2882,13 +2900,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
var minVal = "" var minVal = ""
for row in filteredRows: for row in filteredRows:
let v = evalExpr(expr.aggArgs[0], row, ctx) let v = evalExpr(expr.aggArgs[0], row, ctx)
if minVal == "" or v < minVal: minVal = v if minVal == "" or cmpMin(v, minVal): minVal = v
newRow[alias] = minVal newRow[alias] = minVal
of irMax: of irMax:
var maxVal = "" var maxVal = ""
for row in filteredRows: for row in filteredRows:
let v = evalExpr(expr.aggArgs[0], row, ctx) let v = evalExpr(expr.aggArgs[0], row, ctx)
if maxVal == "" or v > maxVal: maxVal = v if maxVal == "" or cmpMax(v, maxVal): maxVal = v
newRow[alias] = maxVal newRow[alias] = maxVal
of irArrayAgg: of irArrayAgg:
var arr: seq[string] var arr: seq[string]
@@ -3057,13 +3075,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
var minVal = "" var minVal = ""
for row in filteredRows: for row in filteredRows:
let v = evalExpr(aggExpr.aggArgs[0], row, ctx) let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
if minVal == "" or v < minVal: minVal = v if minVal == "" or cmpMin(v, minVal): minVal = v
aggRow[aggKey] = minVal aggRow[aggKey] = minVal
of irMax: of irMax:
var maxVal = "" var maxVal = ""
for row in filteredRows: for row in filteredRows:
let v = evalExpr(aggExpr.aggArgs[0], row, ctx) let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
if maxVal == "" or v > maxVal: maxVal = v if maxVal == "" or cmpMax(v, maxVal): maxVal = v
aggRow[aggKey] = maxVal aggRow[aggKey] = maxVal
of irArrayAgg: of irArrayAgg:
var arr: seq[string] var arr: seq[string]
@@ -3550,13 +3568,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
var minVal = "" var minVal = ""
for row in matchingRows: for row in matchingRows:
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx) let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
if minVal == "" or v < minVal: minVal = v if minVal == "" or cmpMin(v, minVal): minVal = v
aggResult = minVal aggResult = minVal
of irMax: of irMax:
var maxVal = "" var maxVal = ""
for row in matchingRows: for row in matchingRows:
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx) let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
if maxVal == "" or v > maxVal: maxVal = v if maxVal == "" or cmpMax(v, maxVal): maxVal = v
aggResult = maxVal aggResult = maxVal
else: discard else: discard
# Clean pivot value (remove quotes) # Clean pivot value (remove quotes)