From 9310c12547689ddeaaf2d47061eabf88b0951a73 Mon Sep 17 00:00:00 2001 From: Bykov Ivan Date: Fri, 22 Nov 2024 17:19:59 +0500 Subject: [PATCH] Query ID Calculation Fix for DISTINCT / ORDER BY and LIMIT / OFFSET In some cases, we may encounter different query trees with the same IDs. For two structurally similar query subnodes, the query trees may look like this: QueryA->subNodeOne = Value X; QueryA->subNodeTwo = NULL; QueryB->subNodeOne = NULL; QueryB->subNodeTwo = Value X; When the query jumble walker calculates the query ID, it traverses the Query members from top to bottom and generates the same IDs for these two queries because it does not change the hash value when visiting an empty node (= NULL). There are two pairs of subnodes that can trigger this error: - distinctClause and sortClause (both contain a list of SortGroupClauses); - limitOffset and limitCount (both contain an int8 expression). To fix this problem, the definition of the Query node has been changed so that a scalar field is placed between similar subnodes. --- src/include/nodes/parsenodes.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 67c90a2bd3..4710ffb6d9 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -208,11 +208,11 @@ typedef struct Query List *distinctClause; /* a list of SortGroupClause's */ - List *sortClause; /* a list of SortGroupClause's */ - Node *limitOffset; /* # of result tuples to skip (int8 expr) */ - Node *limitCount; /* # of result tuples to return (int8 expr) */ LimitOption limitOption; /* limit type */ + Node *limitCount; /* # of result tuples to return (int8 expr) */ + + List *sortClause; /* a list of SortGroupClause's */ List *rowMarks; /* a list of RowMarkClause's */ -- 2.39.2