]> granicus.if.org Git - postgresql/commitdiff
Prevent segfault in expand_tuple with no missing values
authorAndrew Dunstan <andrew@dunslane.net>
Fri, 13 Apr 2018 20:43:33 +0000 (16:43 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Fri, 13 Apr 2018 20:43:33 +0000 (16:43 -0400)
Commit 16828d5c forgot to check that it had a set of missing values
before trying to retrieve a value from it.

An additional query to add coverage for this code is added to the
regression test.

Per bug report from Andreas Seltenreich.

src/backend/access/common/heaptuple.c
src/test/regress/expected/fast_default.out
src/test/regress/sql/fast_default.sql

index c64645675e6867020aabf067b135eb3207f88a61..b9802b92c0bb6e1791bdb8b955042673cc39ee7d 100644 (file)
@@ -981,7 +981,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
 
                Form_pg_attribute attr = TupleDescAttr(tupleDesc, attnum);
 
-               if (attrmiss[attnum].ammissingPresent)
+               if (attrmiss && attrmiss[attnum].ammissingPresent)
                {
                        fill_val(attr,
                                         nullBits ? &nullBits : NULL,
index 3568fa7b8a9f7b0d254cb325d034a7dfb3dd7502..ef8d04f59c8e8fcc9f168cacf39e74e32b176a96 100644 (file)
@@ -505,6 +505,41 @@ SELECT comp();
  Unchanged
 (1 row)
 
+-- query to exercise expand_tuple function
+CREATE TABLE t1 AS
+SELECT 1::int AS a , 2::int AS b
+FROM generate_series(1,20) q;
+ALTER TABLE t1 ADD COLUMN c text;
+SELECT a,
+       stddev(cast((SELECT sum(1) FROM generate_series(1,20) x) AS float4))
+          OVER (PARTITION BY a,b,c ORDER BY b)
+       AS z
+FROM t1;
+ a | z 
+---+---
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+ 1 | 0
+(20 rows)
+
+DROP TABLE t1;
 DROP TABLE T;
 DROP FUNCTION set(name);
 DROP FUNCTION comp();
index ea707d402af6352cefe35f9710831484d79fc389..0e660330f77c8a9017961a9a2deca5cf929ef1da 100644 (file)
@@ -347,6 +347,20 @@ SELECT c_text FROM T WHERE c_int = -1;
 
 SELECT comp();
 
+-- query to exercise expand_tuple function
+CREATE TABLE t1 AS
+SELECT 1::int AS a , 2::int AS b
+FROM generate_series(1,20) q;
+
+ALTER TABLE t1 ADD COLUMN c text;
+
+SELECT a,
+       stddev(cast((SELECT sum(1) FROM generate_series(1,20) x) AS float4))
+          OVER (PARTITION BY a,b,c ORDER BY b)
+       AS z
+FROM t1;
+
+DROP TABLE t1;
 DROP TABLE T;
 DROP FUNCTION set(name);
 DROP FUNCTION comp();