Thread: pgsql: Don't store intermediate hash values in ExprState->resvalue
Don't store intermediate hash values in ExprState->resvalue adf97c156 made it so ExprStates could support hashing and changed Hash Join to use that instead of manually extracting Datums from tuples and hashing them one column at a time. When hashing multiple columns or expressions, the code added in that commit stored the intermediate hash value in the ExprState's resvalue field. That was a mistake as steps may be injected into the ExprState between each hashing step that look at or overwrite the stored intermediate hash value. EEOP_PARAM_SET is an example of such a step. Here we fix this by adding a new dedicated field for storing intermediate hash values and adjust the code so that all apart from the final hashing step store their result in the intermediate field. In passing, rename a variable so that it's more aligned to the surrounding code and also so a few lines stay within the 80 char margin. Reported-by: Andres Freund Reviewed-by: Alena Rybakina <a.rybakina@postgrespro.ru> Discussion: https://postgr.es/m/CAApHDvqo9eenEFXND5zZ9JxO_k4eTA4jKMGxSyjdTrsmYvnmZw@mail.gmail.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/9ca67658d19e6c258eb4021a326ed7d38b3ab75f Modified Files -------------- src/backend/executor/execExpr.c | 35 +++++++++++++++++++--- src/backend/executor/execExprInterp.c | 16 +++++----- src/backend/jit/llvm/llvmjit_expr.c | 18 ++++++++---- src/include/executor/execExpr.h | 1 + src/test/regress/expected/join.out | 55 +++++++++++++++++++++++++++++++++++ src/test/regress/sql/join.sql | 21 +++++++++++++ 6 files changed, 129 insertions(+), 17 deletions(-)