From 8577521efe8fdfc593c81d5173878b8b2ebed407 Mon Sep 17 00:00:00 2001 From: luo_zihao5524 Date: Fri, 22 Jul 2022 14:57:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A1=8C=E5=AD=98=E5=90=91?= =?UTF-8?q?=E9=87=8F=E5=8C=96=E5=9C=A8=E5=88=9B=E5=BB=BA=E7=89=A9=E5=8C=96?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E6=97=B6=E7=BB=93=E6=9E=9C=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/executor/nodeSeqscan.cpp | 48 +++++++++++++++++-- .../regress/expected/force_vector_engine2.out | 20 +++++++- src/test/regress/sql/force_vector_engine2.sql | 8 ++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/gausskernel/runtime/executor/nodeSeqscan.cpp b/src/gausskernel/runtime/executor/nodeSeqscan.cpp index aa3a1b6b6..80f835431 100644 --- a/src/gausskernel/runtime/executor/nodeSeqscan.cpp +++ b/src/gausskernel/runtime/executor/nodeSeqscan.cpp @@ -288,18 +288,60 @@ void ExecStoreTupleBatchMode(TableScanDesc scanDesc, TupleTableSlot** slot) } } +bool FetchEpqTupleBatchMode(ScanState* node) +{ + EState* estate = node->ps.state; + Index scan_rel_id = ((Scan*)node->ps.plan)->scanrelid; + Assert(scan_rel_id > 0); + + if (estate->es_epqTupleSet[scan_rel_id - 1]) { + TupleTableSlot* slot = node->scanBatchState->scanBatch.scanTupleSlotInBatch[0]; + + /* Return empty slot if we already returned a tuple */ + if (estate->es_epqScanDone[scan_rel_id - 1]) { + (void)ExecClearTuple(slot); + return true; + } + /* Else mark to remember that we shouldn't return more */ + estate->es_epqScanDone[scan_rel_id - 1] = true; + + /* Return empty slot if we haven't got a test tuple */ + if (estate->es_epqTuple[scan_rel_id - 1] == NULL) { + (void)ExecClearTuple(slot); + return true; + } + + /* Store test tuple in the plan node's scan slot */ + (void)ExecStoreTuple(estate->es_epqTuple[scan_rel_id - 1], slot, InvalidBuffer, false); + + return true; + } + + return false; +} + static ScanBatchResult *SeqNextBatchMode(SeqScanState *node) { TableScanDesc scanDesc; - EState *estate = NULL; + EState *estate = node->ps.state; ScanDirection direction; - TupleTableSlot **slot = NULL; + TupleTableSlot **slot = &(node->scanBatchState->scanBatch.scanTupleSlotInBatch[0]); + + /* while inside an EvalPlanQual recheck, return a test tuple */ + if (estate->es_epqTuple != NULL && FetchEpqTupleBatchMode(node)) { + if (TupIsNull(slot[0])) { + node->scanBatchState->scanBatch.rows = 0; + return NULL; + } else { + node->scanBatchState->scanBatch.rows = 1; + return &node->scanBatchState->scanBatch; + } + } /* get information from the estate and scan state */ scanDesc = node->ss_currentScanDesc; estate = node->ps.state; direction = estate->es_direction; - slot = &(node->scanBatchState->scanBatch.scanTupleSlotInBatch[0]); /* get tuples from the table. */ scanDesc->rs_maxScanRows = node->scanBatchState->scanTupleSlotMaxNum; diff --git a/src/test/regress/expected/force_vector_engine2.out b/src/test/regress/expected/force_vector_engine2.out index 051f09ebc..69a4c4414 100644 --- a/src/test/regress/expected/force_vector_engine2.out +++ b/src/test/regress/expected/force_vector_engine2.out @@ -47,6 +47,24 @@ explain (analyze on, timing off) select /*+ set(try_vector_engine_strategy force --?.* (13 rows) +set try_vector_engine_strategy=force; +create table force_tb1(c1 int,c2 int); +insert into force_tb1 values(1,1); +insert into force_tb1 values(2,2); +create incremental materialized view v_force as select * from force_tb1; +select * from v_force order by 1; + c1 | c2 +----+---- + 1 | 1 + 2 | 2 +(2 rows) + +set try_vector_engine_strategy=off; drop table force_vector_test; drop schema test_force_vector2 cascade; -NOTICE: drop cascades to table force_vector_partition +NOTICE: drop cascades to 5 other objects +DETAIL: drop cascades to table force_vector_partition +drop cascades to table force_tb1 +drop cascades to materialized view v_force +--?.* +--?.* diff --git a/src/test/regress/sql/force_vector_engine2.sql b/src/test/regress/sql/force_vector_engine2.sql index d288767d7..b99806ca4 100644 --- a/src/test/regress/sql/force_vector_engine2.sql +++ b/src/test/regress/sql/force_vector_engine2.sql @@ -18,5 +18,13 @@ analyze force_vector_partition; explain (analyze on, timing off) select /*+ set(try_vector_engine_strategy force) */ id, val1*2, val2+val1 as val3 from force_vector_test where id < 5000 and val1 < 500 order by id limit 10; explain (analyze on, timing off) select /*+ set(try_vector_engine_strategy force) */ id, avg(val1), sum(val2) from force_vector_partition group by id order by id limit 10; +set try_vector_engine_strategy=force; +create table force_tb1(c1 int,c2 int); +insert into force_tb1 values(1,1); +insert into force_tb1 values(2,2); +create incremental materialized view v_force as select * from force_tb1; +select * from v_force order by 1; +set try_vector_engine_strategy=off; + drop table force_vector_test; drop schema test_force_vector2 cascade;