From d3b77174dab8b15cec83b504202f0117f9a4a386 Mon Sep 17 00:00:00 2001 From: dimgigov Date: Tue, 19 May 2026 15:19:47 +0300 Subject: [PATCH] fix: use numeric comparison for MIN/MAX aggregates --- src/barabadb/query/executor.nim | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/barabadb/query/executor.nim b/src/barabadb/query/executor.nim index 8900381..f6b9eaa 100644 --- a/src/barabadb/query/executor.nim +++ b/src/barabadb/query/executor.nim @@ -24,6 +24,24 @@ import ../storage/wal import ../core/mvcc import ../core/tracing 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 ../graph/engine as gengine import ../graph/community as gcomm @@ -2882,13 +2900,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] = var minVal = "" for row in filteredRows: 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 of irMax: var maxVal = "" for row in filteredRows: 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 of irArrayAgg: var arr: seq[string] @@ -3057,13 +3075,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] = var minVal = "" for row in filteredRows: 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 of irMax: var maxVal = "" for row in filteredRows: 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 of irArrayAgg: var arr: seq[string] @@ -3550,13 +3568,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] = var minVal = "" for row in matchingRows: 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 of irMax: var maxVal = "" for row in matchingRows: 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 else: discard # Clean pivot value (remove quotes)