commit 1dc9af59741fae23d19bd16516c3c06a2fe793e2
parent f544525b67c45c9ccc94ca4c224eb0dd84365729
Author: Christian Grothoff <christian@grothoff.org>
Date: Fri, 9 Oct 2026 22:56:17 +0200
fix SQL queries to avoid O(n^2) complexity
Diffstat:
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/src/backenddb/iterate_orders.c b/src/backenddb/iterate_orders.c
@@ -167,9 +167,10 @@ TALER_MERCHANTDB_iterate_orders (
" AND ($8 OR "
" NOT CAST($9 AS BOOL))" /* unclaimed orders are never wired */
" AND"
- " (order_serial NOT IN"
- " (SELECT order_serial"
- " FROM merchant_contract_terms))" /* only select unclaimed orders */
+ " NOT EXISTS"
+ " (SELECT 1"
+ " FROM merchant_contract_terms mct"
+ " WHERE mct.order_serial=merchant_orders.order_serial)" /* only select unclaimed orders */
" AND ($10 OR "
" ($11 = session_id))"
" AND ($12 OR "
@@ -192,9 +193,10 @@ TALER_MERCHANTDB_iterate_orders (
" AND ($4 OR "
" (CAST($5 AS BOOL) = paid))"
" AND ($6 OR "
- " (CAST($7 AS BOOL) = (order_serial IN"
- " (SELECT order_serial "
- " FROM merchant_refunds))))"
+ " (CAST($7 AS BOOL) = EXISTS"
+ " (SELECT 1"
+ " FROM merchant_refunds mr"
+ " WHERE mr.order_serial=merchant_contract_terms.order_serial)))"
" AND ($8 OR"
" (CAST($9 AS BOOL) = wired))"
" AND ($10 OR "
@@ -229,9 +231,10 @@ TALER_MERCHANTDB_iterate_orders (
" AND ($8 OR "
" NOT CAST($9 AS BOOL))" /* unclaimed orders are never wired */
" AND"
- " order_serial NOT IN"
- " (SELECT order_serial"
- " FROM merchant_contract_terms)" /* only select unclaimed orders */
+ " NOT EXISTS"
+ " (SELECT 1"
+ " FROM merchant_contract_terms mct"
+ " WHERE mct.order_serial=merchant_orders.order_serial)" /* only select unclaimed orders */
" AND ($10 OR "
" ($11 = session_id))"
" AND ($12 OR "
@@ -254,9 +257,10 @@ TALER_MERCHANTDB_iterate_orders (
" AND ($4 OR "
" (CAST($5 AS BOOL) = paid))"
" AND ($6 OR "
- " (CAST($7 AS BOOL) = (order_serial IN"
- " (SELECT order_serial "
- " FROM merchant_refunds))))"
+ " (CAST($7 AS BOOL) = EXISTS"
+ " (SELECT 1"
+ " FROM merchant_refunds mr"
+ " WHERE mr.order_serial=merchant_contract_terms.order_serial)))"
" AND ($8 OR"
" (CAST($9 AS BOOL) = wired))"
" AND ($10 OR "