Changeset: a912db812a1f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a912db812a1f
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/test/BugTracker-2026/Tests/All
        sql/test/Tests/limit_offset_fetchfirst.test
Branch: default
Log Message:

allow limit 0, using firstn


diffs (85 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4786,6 +4786,8 @@ sub_topn(backend *be, stmt *sub, stmt **
                *Psub = stmt_list(be, npl);
        }
 
+       if (!sub)
+               return sub;
        /* also rebuild sub as multiple orderby expressions may use the sub 
table (ie aren't part of the result columns) */
        pl = sub->op4.lval;
        npl = sa_list(be->mvc->sa);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1346,33 +1346,20 @@ stmt_limit(backend *be, stmt *col, stmt 
                        }
                }
        } else {
-               int len;
-
-               q = newStmt(mb, calcRef, plusRef);
-               if (q == NULL)
-                       goto bailout;
-               q = pushArgument(mb, q, offset->nr);
-               q = pushArgument(mb, q, limit->nr);
-               len = getDestVar(q);
-               pushInstruction(mb, q);
-
-               /* since both arguments of algebra.subslice are
-                  inclusive correct the LIMIT value by
-                  subtracting 1 */
-               q = newStmt(mb, calcRef, minusRef);
-               if (q == NULL)
-                       goto bailout;
-               q = pushArgument(mb, q, len);
-               q = pushInt(mb, q, 1);
-               len = getDestVar(q);
-               pushInstruction(mb, q);
-
-               q = newStmt(mb, algebraRef, subsliceRef);
+               q = newStmtArgs(mb, algebraRef, firstnRef, 9);
                if (q == NULL)
                        goto bailout;
                q = pushArgument(mb, q, c);
+               q = pushNilBat(mb, q);
+               q = pushNilBat(mb, q);
+               q = pushArgument(mb, q, limit->nr);
                q = pushArgument(mb, q, offset->nr);
-               q = pushArgument(mb, q, len);
+               q = pushBit(mb, q, false); /* return skipped */
+               q = pushBit(mb, q, bit_nil); /* no direction */
+               q = pushBit(mb, q, bit_nil); /* nulls not handled specialy */
+               q = pushBit(mb, q, false); /* no info on distinct */
+
+               l = getArg(q, 0);
                l = getDestVar(q);
                pushInstruction(mb, q);
        }
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -149,7 +149,7 @@ KNOWNFAIL?7957-tail_type-crash
 KNOWNFAIL?7961-list_empty-crash
 KNOWNFAIL?7963-having-sum-or-exists-or-sum-bug
 7964-optimize-limit-0-queries
-KNOWNFAIL?7965-select-1-limit-0-bug
+7965-select-1-limit-0-bug
 7966-optimize-select-distinct-from-union-queries
 7967-optimize-in-select-distinct-queries
 7968-optimize-distinct-from-q1-except-q2
diff --git a/sql/test/Tests/limit_offset_fetchfirst.test 
b/sql/test/Tests/limit_offset_fetchfirst.test
--- a/sql/test/Tests/limit_offset_fetchfirst.test
+++ b/sql/test/Tests/limit_offset_fetchfirst.test
@@ -18,8 +18,9 @@ select * from limittest ORDER BY value L
 statement error
 select * from limittest LIMIT +5
 
-statement error
+query I
 select * from limittest LIMIT 0
+----
 
 statement error
 select * from limittest LIMIT -5
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to