Re: Consistent segfault in complex query

Поиск
Список
Период
Сортировка
От Andrew Gierth
Тема Re: Consistent segfault in complex query
Дата
Msg-id 87lg84n7qh.fsf@news-spur.riddles.org.uk
обсуждение исходный текст
Ответ на Re: Consistent segfault in complex query  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: Consistent segfault in complex query  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
>>>>> "Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:

 >> Your other idea of forcing initPlan parameters to be evaluated
 >> before we enter the EPQ execution environment is probably more
 >> workable.

 Tom> Concretely, the attached seems to be enough to fix it (though I
 Tom> only tried the simplest case you posted).

If it helps, here is a patch that adds isolation tests to
eval-plan-qual.spec for two test cases (one with CTE, one without).
I've verified that these reproduce the crash, and that they run
successfully with your patch. I can't currently see any more specific
code paths to probe in these tests.

-- 
Andrew (irc:RhodiumToad)

diff --git a/src/test/isolation/expected/eval-plan-qual.out b/src/test/isolation/expected/eval-plan-qual.out
index 9bbfdc1b5d..49b3fb3446 100644
--- a/src/test/isolation/expected/eval-plan-qual.out
+++ b/src/test/isolation/expected/eval-plan-qual.out
@@ -184,6 +184,37 @@ ta_id          ta_value       tb_row
 1              newTableAValue (1,tableBValue)
 step c2: COMMIT;
 
+starting permutation: updateforcip updateforcip2 c1 c2 read_a
+step updateforcip: 
+    UPDATE table_a SET value = NULL WHERE id = 1;
+
+step updateforcip2: 
+    UPDATE table_a SET value = COALESCE(value, (SELECT text 'newValue')) WHERE id = 1;
+ <waiting ...>
+step c1: COMMIT;
+step updateforcip2: <... completed>
+step c2: COMMIT;
+step read_a: SELECT * FROM table_a ORDER BY id;
+id             value          
+
+1              newValue       
+
+starting permutation: updateforcip updateforcip3 c1 c2 read_a
+step updateforcip: 
+    UPDATE table_a SET value = NULL WHERE id = 1;
+
+step updateforcip3: 
+    WITH d(val) AS (SELECT text 'newValue' FROM generate_series(1,1))
+    UPDATE table_a SET value = COALESCE(value, (SELECT val FROM d)) WHERE id = 1;
+ <waiting ...>
+step c1: COMMIT;
+step updateforcip3: <... completed>
+step c2: COMMIT;
+step read_a: SELECT * FROM table_a ORDER BY id;
+id             value          
+
+1              newValue       
+
 starting permutation: wrtwcte readwcte c1 c2
 step wrtwcte: UPDATE table_a SET value = 'tableAValue2' WHERE id = 1;
 step readwcte: 
diff --git a/src/test/isolation/specs/eval-plan-qual.spec b/src/test/isolation/specs/eval-plan-qual.spec
index 0b70ad55ba..367922de75 100644
--- a/src/test/isolation/specs/eval-plan-qual.spec
+++ b/src/test/isolation/specs/eval-plan-qual.spec
@@ -92,6 +92,13 @@ step "updateforss"    {
     UPDATE table_b SET value = 'newTableBValue' WHERE id = 1;
 }
 
+# these tests exercise EvalPlanQual with conditional InitPlans which
+# have not been executed prior to the EPQ
+
+step "updateforcip"    {
+    UPDATE table_a SET value = NULL WHERE id = 1;
+}
+
 # these tests exercise mark/restore during EPQ recheck, cf bug #15032
 
 step "selectjoinforupdate"    {
@@ -129,6 +136,13 @@ step "readforss"    {
     FROM table_a ta
     WHERE ta.id = 1 FOR UPDATE OF ta;
 }
+step "updateforcip2"    {
+    UPDATE table_a SET value = COALESCE(value, (SELECT text 'newValue')) WHERE id = 1;
+}
+step "updateforcip3"    {
+    WITH d(val) AS (SELECT text 'newValue' FROM generate_series(1,1))
+    UPDATE table_a SET value = COALESCE(value, (SELECT val FROM d)) WHERE id = 1;
+}
 step "wrtwcte"    { UPDATE table_a SET value = 'tableAValue2' WHERE id = 1; }
 step "wrjt"    { UPDATE jointest SET data = 42 WHERE id = 7; }
 step "c2"    { COMMIT; }
@@ -137,6 +151,7 @@ session "s3"
 setup        { BEGIN ISOLATION LEVEL READ COMMITTED; }
 step "read"    { SELECT * FROM accounts ORDER BY accountid; }
 step "read_ext"    { SELECT * FROM accounts_ext ORDER BY accountid; }
+step "read_a"    { SELECT * FROM table_a ORDER BY id; }
 
 # this test exercises EvalPlanQual with a CTE, cf bug #14328
 step "readwcte"    {
@@ -171,6 +186,8 @@ permutation "wx2" "partiallock" "c2" "c1" "read"
 permutation "wx2" "lockwithvalues" "c2" "c1" "read"
 permutation "wx2_ext" "partiallock_ext" "c2" "c1" "read_ext"
 permutation "updateforss" "readforss" "c1" "c2"
+permutation "updateforcip" "updateforcip2" "c1" "c2" "read_a"
+permutation "updateforcip" "updateforcip3" "c1" "c2" "read_a"
 permutation "wrtwcte" "readwcte" "c1" "c2"
 permutation "wrjt" "selectjoinforupdate" "c2" "c1"
 permutation "wrtwcte" "multireadwcte" "c1" "c2"

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: Cache lookup errors with functions manipulation object addresses
Следующее
От: Michael Paquier
Дата:
Сообщение: Re: Cache lookup errors with functions manipulation object addresses