Content-Length: 148949 | pFad | http://github.com/postgrespro/rum/pull/152.patch
thub.com
From e3ddcda49348dac05469bee4c444a93b9c3c7d18 Mon Sep 17 00:00:00 2001
From: Potapov Alexander
Date: Tue, 11 Feb 2025 14:03:41 +0300
Subject: [PATCH] PGPRO-11987 Support new Optimizer's behaviour in regression
tests
---
expected/altorder.out | 9 +-
expected/altorder_1.out | 9 +-
expected/altorder_2.out | 598 ++++++++++++++++++++++
expected/altorder_hash.out | 5 +
expected/altorder_hash_1.out | 5 +
expected/altorder_hash_2.out | 363 ++++++++++++++
expected/array.out | 6 +
expected/array_1.out | 6 +
expected/array_2.out | 929 +++++++++++++++++++++++++++++++++++
expected/array_3.out | 922 ++++++++++++++++++++++++++++++++++
expected/int8.out | 5 +
expected/int8_1.out | 5 +
expected/int8_2.out | 701 ++++++++++++++++++++++++++
expected/orderby.out | 78 +--
expected/orderby_1.out | 46 +-
expected/orderby_hash.out | 78 +--
expected/orderby_hash_1.out | 46 +-
expected/rum.out | 1 +
expected/rum_hash.out | 1 +
expected/text.out | 12 +
expected/text_1.out | 337 +++++++++++++
sql/altorder.sql | 11 +-
sql/altorder_hash.sql | 5 +
sql/array.sql | 6 +
sql/int8.sql | 5 +
sql/orderby.sql | 18 +-
sql/orderby_hash.sql | 18 +-
sql/rum.sql | 1 +
sql/rum_hash.sql | 1 +
sql/text.sql | 12 +
30 files changed, 4095 insertions(+), 144 deletions(-)
create mode 100644 expected/altorder_2.out
create mode 100644 expected/altorder_hash_2.out
create mode 100644 expected/array_2.out
create mode 100644 expected/array_3.out
create mode 100644 expected/int8_2.out
create mode 100644 expected/text_1.out
diff --git a/expected/altorder.out b/expected/altorder.out
index 6c0bcae2ad..9f33015ce6 100644
--- a/expected/altorder.out
+++ b/expected/altorder.out
@@ -3,8 +3,13 @@
* NOTE: This test behaves differenly
* ------------------------------------
*
- * altorder.out - test output for 64-bit systems and
- * altorder_1.out - test output for 32-bit systems.
+ * altorder.out - test output for 64-bit systems
+ * altorder_1.out - test output for 32-bit systems
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_2.out - test output for 32-bit systems (>=18)
*
*/
CREATE TABLE atsts (id int, t tsvector, d timestamp);
diff --git a/expected/altorder_1.out b/expected/altorder_1.out
index 980515f58e..83db595bc0 100644
--- a/expected/altorder_1.out
+++ b/expected/altorder_1.out
@@ -3,8 +3,13 @@
* NOTE: This test behaves differenly
* ------------------------------------
*
- * altorder.out - test output for 64-bit systems and
- * altorder_1.out - test output for 32-bit systems.
+ * altorder.out - test output for 64-bit systems
+ * altorder_1.out - test output for 32-bit systems
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_2.out - test output for 32-bit systems (>=18)
*
*/
CREATE TABLE atsts (id int, t tsvector, d timestamp);
diff --git a/expected/altorder_2.out b/expected/altorder_2.out
new file mode 100644
index 0000000000..fec9d06d05
--- /dev/null
+++ b/expected/altorder_2.out
@@ -0,0 +1,598 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * altorder.out - test output for 64-bit systems
+ * altorder_1.out - test output for 32-bit systems
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_2.out - test output for 32-bit systems (>=18)
+ *
+ */
+CREATE TABLE atsts (id int, t tsvector, d timestamp);
+\copy atsts from 'data/tsts.data'
+-- PGPRO-2537: We need more data to test rumsort.c with logtape.c
+\copy atsts from 'data/tsts.data'
+\copy atsts from 'data/tsts.data'
+\copy atsts from 'data/tsts.data'
+CREATE INDEX atsts_idx ON atsts USING rum (t rum_tsvector_addon_ops, d)
+ WITH (attach = 'd', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+INSERT INTO atsts VALUES (-1, 't1 t2', '2016-05-02 02:24:22.326724');
+INSERT INTO atsts VALUES (-2, 't1 t2 t3', '2016-05-02 02:26:22.326724');
+SELECT count(*) FROM atsts WHERE t @@ 'wr|qh';
+ count
+-------
+ 632
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'wr&qh';
+ count
+-------
+ 68
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'eq&yt';
+ count
+-------
+ 24
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'eq|yt';
+ count
+-------
+ 392
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ '(eq&yt)|(wr&qh)';
+ count
+-------
+ 92
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ '(eq|yt)&(wr|qh)';
+ count
+-------
+ 156
+(1 row)
+
+SET enable_indexscan=OFF;
+SET enable_indexonlyscan=OFF;
+SET enable_bitmapscan=OFF;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+(5 rows)
+
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+(5 rows)
+
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+(5 rows)
+
+SELECT count(*) FROM atsts WHERE d < '2016-05-16 14:21:25';
+ count
+-------
+ 1422
+(1 row)
+
+SELECT count(*) FROM atsts WHERE d > '2016-05-16 14:21:25';
+ count
+-------
+ 612
+(1 row)
+
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+(36 rows)
+
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+(32 rows)
+
+-- Test bitmap index scan
+SET enable_bitmapscan=on;
+SET enable_seqscan = off;
+EXPLAIN (costs off)
+SELECT count(*) FROM atsts WHERE t @@ 'wr|qh';
+ QUERY PLAN
+---------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' | ''qh'''::tsquery)
+(5 rows)
+
+SELECT count(*) FROM atsts WHERE t @@ 'wr|qh';
+ count
+-------
+ 632
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'wr&qh';
+ count
+-------
+ 68
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'eq&yt';
+ count
+-------
+ 24
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ 'eq|yt';
+ count
+-------
+ 392
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ '(eq&yt)|(wr&qh)';
+ count
+-------
+ 92
+(1 row)
+
+SELECT count(*) FROM atsts WHERE t @@ '(eq|yt)&(wr|qh)';
+ count
+-------
+ 156
+(1 row)
+
+EXPLAIN (costs off)
+SELECT count(*) FROM atsts WHERE d < '2016-05-16 14:21:25';
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (d < 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(5 rows)
+
+SELECT count(*) FROM atsts WHERE d < '2016-05-16 14:21:25';
+ count
+-------
+ 1422
+(1 row)
+
+EXPLAIN (costs off)
+SELECT count(*) FROM atsts WHERE d > '2016-05-16 14:21:25';
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (d > 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(5 rows)
+
+SELECT count(*) FROM atsts WHERE d > '2016-05-16 14:21:25';
+ count
+-------
+ 612
+(1 row)
+
+-- Test index scan
+SET enable_indexscan=on;
+SET enable_indexonlyscan=on;
+SET enable_bitmapscan=off;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=| 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d |=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+(7 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: d
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d <= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+(6 rows)
+
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 16 | Mon May 02 11:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+(36 rows)
+
+EXPLAIN (costs off)
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: d
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d >= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+(6 rows)
+
+SELECT id, d FROM atsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+(32 rows)
+
+EXPLAIN (costs off)
+SELECT id, d FROM atsts WHERE t @@ 'wr&q:*' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: d
+ -> Seq Scan on atsts
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''q'':*'::tsquery) AND (d >= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+(6 rows)
+
+SELECT id, d FROM atsts WHERE t @@ 'wr&q:*' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 361 | Mon May 16 20:21:22.326724 2016
+ 361 | Mon May 16 20:21:22.326724 2016
+ 361 | Mon May 16 20:21:22.326724 2016
+ 361 | Mon May 16 20:21:22.326724 2016
+ 369 | Tue May 17 04:21:22.326724 2016
+ 369 | Tue May 17 04:21:22.326724 2016
+ 369 | Tue May 17 04:21:22.326724 2016
+ 369 | Tue May 17 04:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 371 | Tue May 17 06:21:22.326724 2016
+ 372 | Tue May 17 07:21:22.326724 2016
+ 372 | Tue May 17 07:21:22.326724 2016
+ 372 | Tue May 17 07:21:22.326724 2016
+ 372 | Tue May 17 07:21:22.326724 2016
+ 375 | Tue May 17 10:21:22.326724 2016
+ 375 | Tue May 17 10:21:22.326724 2016
+ 375 | Tue May 17 10:21:22.326724 2016
+ 375 | Tue May 17 10:21:22.326724 2016
+ 388 | Tue May 17 23:21:22.326724 2016
+ 388 | Tue May 17 23:21:22.326724 2016
+ 388 | Tue May 17 23:21:22.326724 2016
+ 388 | Tue May 17 23:21:22.326724 2016
+ 405 | Wed May 18 16:21:22.326724 2016
+ 405 | Wed May 18 16:21:22.326724 2016
+ 405 | Wed May 18 16:21:22.326724 2016
+ 405 | Wed May 18 16:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 422 | Thu May 19 09:21:22.326724 2016
+ 422 | Thu May 19 09:21:22.326724 2016
+ 422 | Thu May 19 09:21:22.326724 2016
+ 422 | Thu May 19 09:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 441 | Fri May 20 04:21:22.326724 2016
+ 441 | Fri May 20 04:21:22.326724 2016
+ 441 | Fri May 20 04:21:22.326724 2016
+ 441 | Fri May 20 04:21:22.326724 2016
+ 444 | Fri May 20 07:21:22.326724 2016
+ 444 | Fri May 20 07:21:22.326724 2016
+ 444 | Fri May 20 07:21:22.326724 2016
+ 444 | Fri May 20 07:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 463 | Sat May 21 02:21:22.326724 2016
+ 463 | Sat May 21 02:21:22.326724 2016
+ 463 | Sat May 21 02:21:22.326724 2016
+ 463 | Sat May 21 02:21:22.326724 2016
+ 465 | Sat May 21 04:21:22.326724 2016
+ 465 | Sat May 21 04:21:22.326724 2016
+ 465 | Sat May 21 04:21:22.326724 2016
+ 465 | Sat May 21 04:21:22.326724 2016
+ 466 | Sat May 21 05:21:22.326724 2016
+ 466 | Sat May 21 05:21:22.326724 2016
+ 466 | Sat May 21 05:21:22.326724 2016
+ 466 | Sat May 21 05:21:22.326724 2016
+ 468 | Sat May 21 07:21:22.326724 2016
+ 468 | Sat May 21 07:21:22.326724 2016
+ 468 | Sat May 21 07:21:22.326724 2016
+ 468 | Sat May 21 07:21:22.326724 2016
+ 471 | Sat May 21 10:21:22.326724 2016
+ 471 | Sat May 21 10:21:22.326724 2016
+ 471 | Sat May 21 10:21:22.326724 2016
+ 471 | Sat May 21 10:21:22.326724 2016
+ 475 | Sat May 21 14:21:22.326724 2016
+ 475 | Sat May 21 14:21:22.326724 2016
+ 475 | Sat May 21 14:21:22.326724 2016
+ 475 | Sat May 21 14:21:22.326724 2016
+ 481 | Sat May 21 20:21:22.326724 2016
+ 481 | Sat May 21 20:21:22.326724 2016
+ 481 | Sat May 21 20:21:22.326724 2016
+ 481 | Sat May 21 20:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 485 | Sun May 22 00:21:22.326724 2016
+ 485 | Sun May 22 00:21:22.326724 2016
+ 485 | Sun May 22 00:21:22.326724 2016
+ 485 | Sun May 22 00:21:22.326724 2016
+ 493 | Sun May 22 08:21:22.326724 2016
+ 493 | Sun May 22 08:21:22.326724 2016
+ 493 | Sun May 22 08:21:22.326724 2016
+ 493 | Sun May 22 08:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+ 499 | Sun May 22 14:21:22.326724 2016
+ 499 | Sun May 22 14:21:22.326724 2016
+ 499 | Sun May 22 14:21:22.326724 2016
+ 499 | Sun May 22 14:21:22.326724 2016
+ 506 | Sun May 22 21:21:22.326724 2016
+ 506 | Sun May 22 21:21:22.326724 2016
+ 506 | Sun May 22 21:21:22.326724 2016
+ 506 | Sun May 22 21:21:22.326724 2016
+(112 rows)
+
diff --git a/expected/altorder_hash.out b/expected/altorder_hash.out
index 1011b90d0c..eb70f9647c 100644
--- a/expected/altorder_hash.out
+++ b/expected/altorder_hash.out
@@ -6,6 +6,11 @@
* altorder_hash.out - test output for 64-bit systems and
* altorder_hash_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_hash_2.out - test output for 32-bit systems (>=18)
+ *
*/
CREATE TABLE atstsh (id int, t tsvector, d timestamp);
\copy atstsh from 'data/tsts.data'
diff --git a/expected/altorder_hash_1.out b/expected/altorder_hash_1.out
index e310fbdb89..d45f699c39 100644
--- a/expected/altorder_hash_1.out
+++ b/expected/altorder_hash_1.out
@@ -6,6 +6,11 @@
* altorder_hash.out - test output for 64-bit systems and
* altorder_hash_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_hash_2.out - test output for 32-bit systems (>=18)
+ *
*/
CREATE TABLE atstsh (id int, t tsvector, d timestamp);
\copy atstsh from 'data/tsts.data'
diff --git a/expected/altorder_hash_2.out b/expected/altorder_hash_2.out
new file mode 100644
index 0000000000..90dfb3a6ba
--- /dev/null
+++ b/expected/altorder_hash_2.out
@@ -0,0 +1,363 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * altorder_hash.out - test output for 64-bit systems and
+ * altorder_hash_1.out - test output for 32-bit systems.
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_hash_2.out - test output for 32-bit systems (>=18)
+ *
+ */
+CREATE TABLE atstsh (id int, t tsvector, d timestamp);
+\copy atstsh from 'data/tsts.data'
+CREATE INDEX atstsh_idx ON atstsh USING rum (t rum_tsvector_hash_addon_ops, d)
+ WITH (attach = 'd', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+INSERT INTO atstsh VALUES (-1, 't1 t2', '2016-05-02 02:24:22.326724');
+INSERT INTO atstsh VALUES (-2, 't1 t2 t3', '2016-05-02 02:26:22.326724');
+SELECT count(*) FROM atstsh WHERE t @@ 'wr|qh';
+ count
+-------
+ 158
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'wr&qh';
+ count
+-------
+ 17
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'eq&yt';
+ count
+-------
+ 6
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'eq|yt';
+ count
+-------
+ 98
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ '(eq&yt)|(wr&qh)';
+ count
+-------
+ 23
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ '(eq|yt)&(wr|qh)';
+ count
+-------
+ 39
+(1 row)
+
+SET enable_indexscan=OFF;
+SET enable_indexonlyscan=OFF;
+SET enable_bitmapscan=OFF;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+ 415 | Thu May 19 02:21:22.326724 2016 | 215997.326724
+(5 rows)
+
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 252 | Thu May 12 07:21:22.326724 2016 | 370802.673276
+ 232 | Wed May 11 11:21:22.326724 2016 | 442802.673276
+ 168 | Sun May 08 19:21:22.326724 2016 | 673202.673276
+(5 rows)
+
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+ 415 | Thu May 19 02:21:22.326724 2016 | 215997.326724
+ 428 | Thu May 19 15:21:22.326724 2016 | 262797.326724
+ 457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
+(5 rows)
+
+SELECT count(*) FROM atstsh WHERE d < '2016-05-16 14:21:25';
+ count
+-------
+ 357
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE d > '2016-05-16 14:21:25';
+ count
+-------
+ 153
+(1 row)
+
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 16 | Mon May 02 11:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+(9 rows)
+
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 371 | Tue May 17 06:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+(8 rows)
+
+-- Test bitmap index scan
+SET enable_bitmapscan=on;
+SET enable_seqscan = off;
+EXPLAIN (costs off)
+SELECT count(*) FROM atstsh WHERE t @@ 'wr|qh';
+ QUERY PLAN
+---------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' | ''qh'''::tsquery)
+(5 rows)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'wr|qh';
+ count
+-------
+ 158
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'wr&qh';
+ count
+-------
+ 17
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'eq&yt';
+ count
+-------
+ 6
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ 'eq|yt';
+ count
+-------
+ 98
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ '(eq&yt)|(wr&qh)';
+ count
+-------
+ 23
+(1 row)
+
+SELECT count(*) FROM atstsh WHERE t @@ '(eq|yt)&(wr|qh)';
+ count
+-------
+ 39
+(1 row)
+
+EXPLAIN (costs off)
+SELECT count(*) FROM atstsh WHERE d < '2016-05-16 14:21:25';
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (d < 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(5 rows)
+
+SELECT count(*) FROM atstsh WHERE d < '2016-05-16 14:21:25';
+ count
+-------
+ 357
+(1 row)
+
+EXPLAIN (costs off)
+SELECT count(*) FROM atstsh WHERE d > '2016-05-16 14:21:25';
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (d > 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(5 rows)
+
+SELECT count(*) FROM atstsh WHERE d > '2016-05-16 14:21:25';
+ count
+-------
+ 153
+(1 row)
+
+-- Test index scan
+SET enable_indexscan=on;
+SET enable_indexonlyscan=on;
+SET enable_bitmapscan=off;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+ 415 | Thu May 19 02:21:22.326724 2016 | 215997.326724
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=| 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d <=| '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d <=| '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 252 | Thu May 12 07:21:22.326724 2016 | 370802.673276
+ 232 | Wed May 11 11:21:22.326724 2016 | 442802.673276
+ 168 | Sun May 08 19:21:22.326724 2016 | 673202.673276
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d |=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, d, d |=> '2016-05-16 14:21:25' FROM atstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+---------------
+ 371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
+ 406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
+ 415 | Thu May 19 02:21:22.326724 2016 | 215997.326724
+ 428 | Thu May 19 15:21:22.326724 2016 | 262797.326724
+ 457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+(7 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM atstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
+ 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: d
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d <= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+(6 rows)
+
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 16 | Mon May 02 11:21:22.326724 2016
+ 39 | Tue May 03 10:21:22.326724 2016
+ 71 | Wed May 04 18:21:22.326724 2016
+ 135 | Sat May 07 10:21:22.326724 2016
+ 168 | Sun May 08 19:21:22.326724 2016
+ 232 | Wed May 11 11:21:22.326724 2016
+ 252 | Thu May 12 07:21:22.326724 2016
+ 354 | Mon May 16 13:21:22.326724 2016
+ 355 | Mon May 16 14:21:22.326724 2016
+(9 rows)
+
+EXPLAIN (costs off)
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: d
+ -> Seq Scan on atstsh
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (d >= 'Mon May 16 14:21:25 2016'::timestamp without time zone))
+(6 rows)
+
+SELECT id, d FROM atstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+ id | d
+-----+---------------------------------
+ 371 | Tue May 17 06:21:22.326724 2016
+ 406 | Wed May 18 17:21:22.326724 2016
+ 415 | Thu May 19 02:21:22.326724 2016
+ 428 | Thu May 19 15:21:22.326724 2016
+ 457 | Fri May 20 20:21:22.326724 2016
+ 458 | Fri May 20 21:21:22.326724 2016
+ 484 | Sat May 21 23:21:22.326724 2016
+ 496 | Sun May 22 11:21:22.326724 2016
+(8 rows)
+
diff --git a/expected/array.out b/expected/array.out
index a2fb3bb8df..3d65d7e899 100644
--- a/expected/array.out
+++ b/expected/array.out
@@ -6,6 +6,12 @@
* array.out - test output for 64-bit systems and
* array_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * array_2.out - test output for 64-bit systems (>=18).
+ * array_3.out - test output for 32-bit systems (>=18).
+ *
*/
set enable_seqscan=off;
set enable_sort=off;
diff --git a/expected/array_1.out b/expected/array_1.out
index cc5f93307c..b7fd610f69 100644
--- a/expected/array_1.out
+++ b/expected/array_1.out
@@ -6,6 +6,12 @@
* array.out - test output for 64-bit systems and
* array_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * array_2.out - test output for 64-bit systems (>=18).
+ * array_3.out - test output for 32-bit systems (>=18).
+ *
*/
set enable_seqscan=off;
set enable_sort=off;
diff --git a/expected/array_2.out b/expected/array_2.out
new file mode 100644
index 0000000000..fc1cd35a83
--- /dev/null
+++ b/expected/array_2.out
@@ -0,0 +1,929 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * array.out - test output for 64-bit systems and
+ * array_1.out - test output for 32-bit systems.
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * array_2.out - test output for 64-bit systems (>=18).
+ * array_3.out - test output for 32-bit systems (>=18).
+ *
+ */
+set enable_seqscan=off;
+set enable_sort=off;
+/*
+ * Complete checks for int2[].
+ */
+CREATE TABLE test_array (
+ i int2[]
+);
+INSERT INTO test_array VALUES ('{}'), ('{0}'), ('{1,2,3,4}'), ('{1,2,3}'), ('{1,2}'), ('{1}');
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+SELECT NULL::int[] = '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] && '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] @> '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] <@ '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] % '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] <=> '{1}';
+ ?column?
+----------
+
+(1 row)
+
+INSERT INTO test_array VALUES (NULL);
+SELECT * FROM test_array WHERE i = '{1}';
+ i
+-----
+ {1}
+(1 row)
+
+DELETE FROM test_array WHERE i IS NULL;
+SELECT * FROM test_array WHERE i = '{NULL}';
+ERROR: array must not contain nulls
+SELECT * FROM test_array WHERE i = '{1,2,3,NULL}';
+ERROR: array must not contain nulls
+SELECT * FROM test_array WHERE i = '{{1,2},{3,4}}';
+ERROR: array must have 1 dimension
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i = '{}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{1}';
+ i
+-----
+ {1}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{1,2}';
+ i
+-------
+ {1,2}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{2,1}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{1,2,3,3}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{0,0}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i && '{}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i && '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i && '{3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+(2 rows)
+
+SELECT * FROM test_array WHERE i && '{4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i && '{1,2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1,2,3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i && '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i @> '{}';
+ i
+-----------
+ {}
+ {0}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(6 rows)
+
+SELECT * FROM test_array WHERE i @> '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i @> '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i @> '{3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+(2 rows)
+
+SELECT * FROM test_array WHERE i @> '{4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{1,2,4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i <@ '{1}';
+ i
+-----
+ {}
+ {1}
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{2}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i <@ '{1,2,4}';
+ i
+-------
+ {}
+ {1,2}
+ {1}
+(3 rows)
+
+SELECT * FROM test_array WHERE i <@ '{1,2,3,4}';
+ i
+-----------
+ {}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(5 rows)
+
+SELECT * FROM test_array WHERE i <@ '{4,3,2,1}';
+ i
+-----------
+ {}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(5 rows)
+
+SELECT * FROM test_array WHERE i <@ '{0,0}';
+ i
+-----
+ {}
+ {0}
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{100}';
+ i
+----
+ {}
+(1 row)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i % '{}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i % '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4,5}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{1,10,20,30,40,50}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i % '{1,10,20,30}';
+ i
+-----
+ {1}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{1,1,1,1,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{1}'::smallint[])
+ Order By: (i <=> '{1}'::smallint[])
+(3 rows)
+
+SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
+ i
+-----------
+ {1}
+ {1,2}
+ {1,2,3}
+ {1,2,3,4}
+(4 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ADD COLUMN add_info timestamp;
+CREATE INDEX idx_array ON test_array
+USING rum (i rum_anyarray_addon_ops, add_info)
+WITH (attach = 'add_info', to = 'i');
+WITH q as (
+ SELECT row_number() OVER (ORDER BY i) idx, ctid FROM test_array
+)
+UPDATE test_array SET add_info = '2016-05-16 14:21:25'::timestamp +
+ format('%s days', q.idx)::interval
+FROM q WHERE test_array.ctid = q.ctid;
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+----------------------------------
+ Seq Scan on test_array
+ Disabled Nodes: 1
+ Filter: (i % '{}'::smallint[])
+(3 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{1}' ORDER BY add_info <=> '2016-05-16 14:21:25' LIMIT 10;
+ QUERY PLAN
+------------------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using idx_array on test_array
+ Index Cond: (i && '{1}'::smallint[])
+ Order By: (add_info <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1}' ORDER BY add_info <=> '2016-05-16 14:21:25' LIMIT 10;
+ i | add_info
+-----------+--------------------------
+ {1} | Thu May 19 14:21:25 2016
+ {1,2} | Fri May 20 14:21:25 2016
+ {1,2,3} | Sat May 21 14:21:25 2016
+ {1,2,3,4} | Sun May 22 14:21:25 2016
+(4 rows)
+
+DROP INDEX idx_array;
+/*
+ * Sanity checks for popular array types.
+ */
+ALTER TABLE test_array ALTER COLUMN i TYPE int4[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::integer[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE int8[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::bigint[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE text[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::text[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE varchar[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::character varying[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE char[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::bpchar[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE numeric[] USING i::numeric[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::numeric[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE float4[] USING i::float4[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::real[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE float8[] USING i::float8[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::double precision[])
+(2 rows)
+
+DROP INDEX idx_array;
+/*
+ * Check ordering using distance operator
+ *
+ * We want to check that index scan provides us correct ordering by distance
+ * operator. File 'data/rum_array.data' contains two arrays that statisfy
+ * i @> '{23,20}' and have finite distance i <=> '{51}', and a bunch of arrays
+ * that statisfy i @> '{23,20}' and have infinite distance i <=> '{51}'.
+ *
+ * When ordering by distance the order of this bunch of arrays with infinite
+ * distance is not determined and may depend of PostgreSQL version and system.
+ * We don't add another sort expression to ORDER BY because that might cause
+ * the planner to avoid using the index. Instead, we replace arrays that have
+ * infinite distance with {-1} to unambiguously determine the test output.
+ *
+ * 'Infinity' is printed differently in the output in different PostgreSQL
+ * versions, so we replace it with -1.
+ */
+CREATE TABLE test_array_order (
+ i int2[]
+);
+\copy test_array_order(i) from 'data/rum_array.data';
+CREATE INDEX idx_array_order ON test_array_order USING rum (i rum_anyarray_ops);
+/*
+ * Check that plan of the query uses ordering provided by index scan
+ */
+EXPLAIN (COSTS OFF)
+SELECT
+ CASE WHEN distance = 'Infinity' THEN '{-1}'
+ ELSE i
+ END i,
+ CASE WHEN distance = 'Infinity' THEN -1
+ ELSE distance::numeric(18,14)
+ END distance
+ FROM
+ (SELECT *, (i <=> '{51}') AS distance
+ FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t;
+ QUERY PLAN
+------------------------------------------------------------
+ Subquery Scan on t
+ -> Index Scan using idx_array_order on test_array_order
+ Index Cond: (i @> '{23,20}'::smallint[])
+ Order By: (i <=> '{51}'::smallint[])
+(4 rows)
+
+SELECT
+ CASE WHEN distance = 'Infinity' THEN '{-1}'
+ ELSE i
+ END i,
+ CASE WHEN distance = 'Infinity' THEN -1
+ ELSE distance::numeric(18,14)
+ END distance
+ FROM
+ (SELECT *, (i <=> '{51}') AS distance
+ FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t;
+ i | distance
+---------------------+------------------
+ {20,23,51} | 1.73205080756888
+ {33,51,20,77,23,65} | 2.44948974278318
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+(12 rows)
+
diff --git a/expected/array_3.out b/expected/array_3.out
new file mode 100644
index 0000000000..c73bd00bcc
--- /dev/null
+++ b/expected/array_3.out
@@ -0,0 +1,922 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * array.out - test output for 64-bit systems and
+ * array_1.out - test output for 32-bit systems.
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * array_2.out - test output for 64-bit systems (>=18).
+ * array_3.out - test output for 32-bit systems (>=18).
+ *
+ */
+set enable_seqscan=off;
+set enable_sort=off;
+/*
+ * Complete checks for int2[].
+ */
+CREATE TABLE test_array (
+ i int2[]
+);
+INSERT INTO test_array VALUES ('{}'), ('{0}'), ('{1,2,3,4}'), ('{1,2,3}'), ('{1,2}'), ('{1}');
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+SELECT NULL::int[] = '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] && '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] @> '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] <@ '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] % '{1}';
+ ?column?
+----------
+
+(1 row)
+
+SELECT NULL::int[] <=> '{1}';
+ ?column?
+----------
+
+(1 row)
+
+INSERT INTO test_array VALUES (NULL);
+SELECT * FROM test_array WHERE i = '{1}';
+ i
+-----
+ {1}
+(1 row)
+
+DELETE FROM test_array WHERE i IS NULL;
+SELECT * FROM test_array WHERE i = '{NULL}';
+ERROR: array must not contain nulls
+SELECT * FROM test_array WHERE i = '{1,2,3,NULL}';
+ERROR: array must not contain nulls
+SELECT * FROM test_array WHERE i = '{{1,2},{3,4}}';
+ERROR: array must have 1 dimension
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i = '{}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{1}';
+ i
+-----
+ {1}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{1,2}';
+ i
+-------
+ {1,2}
+(1 row)
+
+SELECT * FROM test_array WHERE i = '{2,1}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{1,2,3,3}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{0,0}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i = '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i && '{}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i && '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i && '{3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+(2 rows)
+
+SELECT * FROM test_array WHERE i && '{4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i && '{1,2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1,2,3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i && '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i @> '{}';
+ i
+-----------
+ {}
+ {0}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(6 rows)
+
+SELECT * FROM test_array WHERE i @> '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i @> '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i @> '{3}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+(2 rows)
+
+SELECT * FROM test_array WHERE i @> '{4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{1,2,4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i @> '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i <@ '{1}';
+ i
+-----
+ {}
+ {1}
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{2}';
+ i
+----
+ {}
+(1 row)
+
+SELECT * FROM test_array WHERE i <@ '{1,2,4}';
+ i
+-------
+ {}
+ {1,2}
+ {1}
+(3 rows)
+
+SELECT * FROM test_array WHERE i <@ '{1,2,3,4}';
+ i
+-----------
+ {}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(5 rows)
+
+SELECT * FROM test_array WHERE i <@ '{4,3,2,1}';
+ i
+-----------
+ {}
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(5 rows)
+
+SELECT * FROM test_array WHERE i <@ '{0,0}';
+ i
+-----
+ {}
+ {0}
+(2 rows)
+
+SELECT * FROM test_array WHERE i <@ '{100}';
+ i
+----
+ {}
+(1 row)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::smallint[])
+(2 rows)
+
+SELECT * FROM test_array WHERE i % '{}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i % '{1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{4,3,2,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4,5}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+(3 rows)
+
+SELECT * FROM test_array WHERE i % '{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}';
+ i
+-----------
+ {1,2,3,4}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{1,10,20,30,40,50}';
+ i
+---
+(0 rows)
+
+SELECT * FROM test_array WHERE i % '{1,10,20,30}';
+ i
+-----
+ {1}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{1,1,1,1,1}';
+ i
+-----------
+ {1,2,3,4}
+ {1,2,3}
+ {1,2}
+ {1}
+(4 rows)
+
+SELECT * FROM test_array WHERE i % '{0,0}';
+ i
+-----
+ {0}
+(1 row)
+
+SELECT * FROM test_array WHERE i % '{100}';
+ i
+---
+(0 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{1}'::smallint[])
+ Order By: (i <=> '{1}'::smallint[])
+(3 rows)
+
+SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
+ i
+-----------
+ {1}
+ {1,2}
+ {1,2,3}
+ {1,2,3,4}
+(4 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ADD COLUMN add_info timestamp;
+CREATE INDEX idx_array ON test_array
+USING rum (i rum_anyarray_addon_ops, add_info)
+WITH (attach = 'add_info', to = 'i');
+WITH q as (
+ SELECT row_number() OVER (ORDER BY i) idx, ctid FROM test_array
+)
+UPDATE test_array SET add_info = '2016-05-16 14:21:25'::timestamp +
+ format('%s days', q.idx)::interval
+FROM q WHERE test_array.ctid = q.ctid;
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::smallint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+----------------------------------
+ Seq Scan on test_array
+ Disabled Nodes: 1
+ Filter: (i % '{}'::smallint[])
+(3 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{1}' ORDER BY add_info <=> '2016-05-16 14:21:25' LIMIT 10;
+ QUERY PLAN
+------------------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using idx_array on test_array
+ Index Cond: (i && '{1}'::smallint[])
+ Order By: (add_info <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(4 rows)
+
+SELECT * FROM test_array WHERE i && '{1}' ORDER BY add_info <=> '2016-05-16 14:21:25' LIMIT 10;
+ERROR: doesn't support order by over pass-by-reference column
+DROP INDEX idx_array;
+/*
+ * Sanity checks for popular array types.
+ */
+ALTER TABLE test_array ALTER COLUMN i TYPE int4[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::integer[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::integer[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE int8[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::bigint[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::bigint[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE text[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::text[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::text[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE varchar[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::character varying[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::character varying[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE char[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::bpchar[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::bpchar[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE numeric[] USING i::numeric[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::numeric[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::numeric[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE float4[] USING i::float4[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::real[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::real[])
+(2 rows)
+
+DROP INDEX idx_array;
+ALTER TABLE test_array ALTER COLUMN i TYPE float8[] USING i::float8[];
+CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i = '{}';
+ QUERY PLAN
+----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i = '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i && '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i @> '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i @> '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i <@ '{}';
+ QUERY PLAN
+-----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i <@ '{}'::double precision[])
+(2 rows)
+
+EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
+ QUERY PLAN
+----------------------------------------------
+ Index Scan using idx_array on test_array
+ Index Cond: (i % '{}'::double precision[])
+(2 rows)
+
+DROP INDEX idx_array;
+/*
+ * Check ordering using distance operator
+ *
+ * We want to check that index scan provides us correct ordering by distance
+ * operator. File 'data/rum_array.data' contains two arrays that statisfy
+ * i @> '{23,20}' and have finite distance i <=> '{51}', and a bunch of arrays
+ * that statisfy i @> '{23,20}' and have infinite distance i <=> '{51}'.
+ *
+ * When ordering by distance the order of this bunch of arrays with infinite
+ * distance is not determined and may depend of PostgreSQL version and system.
+ * We don't add another sort expression to ORDER BY because that might cause
+ * the planner to avoid using the index. Instead, we replace arrays that have
+ * infinite distance with {-1} to unambiguously determine the test output.
+ *
+ * 'Infinity' is printed differently in the output in different PostgreSQL
+ * versions, so we replace it with -1.
+ */
+CREATE TABLE test_array_order (
+ i int2[]
+);
+\copy test_array_order(i) from 'data/rum_array.data';
+CREATE INDEX idx_array_order ON test_array_order USING rum (i rum_anyarray_ops);
+/*
+ * Check that plan of the query uses ordering provided by index scan
+ */
+EXPLAIN (COSTS OFF)
+SELECT
+ CASE WHEN distance = 'Infinity' THEN '{-1}'
+ ELSE i
+ END i,
+ CASE WHEN distance = 'Infinity' THEN -1
+ ELSE distance::numeric(18,14)
+ END distance
+ FROM
+ (SELECT *, (i <=> '{51}') AS distance
+ FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t;
+ QUERY PLAN
+------------------------------------------------------------
+ Subquery Scan on t
+ -> Index Scan using idx_array_order on test_array_order
+ Index Cond: (i @> '{23,20}'::smallint[])
+ Order By: (i <=> '{51}'::smallint[])
+(4 rows)
+
+SELECT
+ CASE WHEN distance = 'Infinity' THEN '{-1}'
+ ELSE i
+ END i,
+ CASE WHEN distance = 'Infinity' THEN -1
+ ELSE distance::numeric(18,14)
+ END distance
+ FROM
+ (SELECT *, (i <=> '{51}') AS distance
+ FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t;
+ i | distance
+---------------------+------------------
+ {20,23,51} | 1.73205080756888
+ {33,51,20,77,23,65} | 2.44948974278318
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+ {-1} | -1
+(12 rows)
+
diff --git a/expected/int8.out b/expected/int8.out
index 663162a18e..51c9d0deaf 100644
--- a/expected/int8.out
+++ b/expected/int8.out
@@ -6,6 +6,11 @@
* int8.out - test output for 64-bit systems and
* int8_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * int8_2.out - test output for 32-bit systems (>=18)
+ *
*/
set enable_seqscan=off;
CREATE TABLE test_int8 (
diff --git a/expected/int8_1.out b/expected/int8_1.out
index ffced0aaf8..41a3b35406 100644
--- a/expected/int8_1.out
+++ b/expected/int8_1.out
@@ -6,6 +6,11 @@
* int8.out - test output for 64-bit systems and
* int8_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * int8_2.out - test output for 32-bit systems (>=18)
+ *
*/
set enable_seqscan=off;
CREATE TABLE test_int8 (
diff --git a/expected/int8_2.out b/expected/int8_2.out
new file mode 100644
index 0000000000..9a2015eae3
--- /dev/null
+++ b/expected/int8_2.out
@@ -0,0 +1,701 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * int8.out - test output for 64-bit systems and
+ * int8_1.out - test output for 32-bit systems.
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * int8_2.out - test output for 32-bit systems (>=18)
+ *
+ */
+set enable_seqscan=off;
+CREATE TABLE test_int8 (
+ i int8
+);
+INSERT INTO test_int8 VALUES (-2),(-1),(0),(1),(2),(3);
+CREATE INDEX idx_int8 ON test_int8 USING rum (i);
+SELECT * FROM test_int8 WHERE i<1::int8 ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+(3 rows)
+
+SELECT * FROM test_int8 WHERE i<=1::int8 ORDER BY i;
+ i
+----
+ -2
+ -1
+ 0
+ 1
+(4 rows)
+
+SELECT * FROM test_int8 WHERE i=1::int8 ORDER BY i;
+ i
+---
+ 1
+(1 row)
+
+SELECT * FROM test_int8 WHERE i>=1::int8 ORDER BY i;
+ i
+---
+ 1
+ 2
+ 3
+(3 rows)
+
+SELECT * FROM test_int8 WHERE i>1::int8 ORDER BY i;
+ i
+---
+ 2
+ 3
+(2 rows)
+
+EXPLAIN (costs off)
+SELECT *, i <=> 0::int8 FROM test_int8 ORDER BY i <=> 0::int8;
+ QUERY PLAN
+----------------------------------------
+ Index Scan using idx_int8 on test_int8
+ Order By: (i <=> '0'::bigint)
+(2 rows)
+
+SELECT *, i <=> 0::int8 FROM test_int8 ORDER BY i <=> 0::int8;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT *, i <=> 1::int8 FROM test_int8 WHERE i<1::int8 ORDER BY i <=> 1::int8;
+ QUERY PLAN
+----------------------------------------
+ Index Scan using idx_int8 on test_int8
+ Index Cond: (i < '1'::bigint)
+ Order By: (i <=> '1'::bigint)
+(3 rows)
+
+SELECT *, i <=> 1::int8 FROM test_int8 WHERE i<1::int8 ORDER BY i <=> 1::int8;
+ERROR: doesn't support order by over pass-by-reference column
+CREATE TABLE test_int8_o AS SELECT id::int8, t FROM tsts;
+CREATE INDEX test_int8_o_idx ON test_int8_o USING rum
+ (t rum_tsvector_addon_ops, id)
+ WITH (attach = 'id', to = 't');
+RESET enable_seqscan;
+SET enable_indexscan=OFF;
+SET enable_indexonlyscan=OFF;
+SET enable_bitmapscan=OFF;
+SELECT id, id <=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 371 | 29
+ 355 | 45
+(5 rows)
+
+SELECT id, id <=| 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 371 | 29
+ 355 | 45
+ 354 | 46
+ 252 | 148
+ 232 | 168
+(5 rows)
+
+SELECT id, id |=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 457 | 57
+ 458 | 58
+(5 rows)
+
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+RESET enable_indexscan;
+RESET enable_indexonlyscan;
+SET enable_seqscan = off;
+EXPLAIN (costs off)
+SELECT id, id <=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_o_idx on test_int8_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id <=> '400'::bigint)
+(4 rows)
+
+SELECT id, id <=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id, id <=| 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_o_idx on test_int8_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id <=| '400'::bigint)
+(4 rows)
+
+SELECT id, id <=| 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id, id |=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ QUERY PLAN
+-------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_o_idx on test_int8_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id |=> '400'::bigint)
+(4 rows)
+
+SELECT id, id |=> 400 FROM test_int8_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_int8_o_idx on test_int8_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::bigint))
+(4 rows)
+
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_int8_o_idx on test_int8_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::bigint))
+(4 rows)
+
+SELECT id FROM test_int8_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+CREATE TABLE test_int8_a AS SELECT id::int8, t FROM tsts;
+CREATE INDEX test_int8_a_idx ON test_int8_a USING rum
+ (t rum_tsvector_addon_ops, id)
+ WITH (attach = 'id', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+EXPLAIN (costs off)
+SELECT count(*) FROM test_int8_a WHERE id < 400::int8;
+ QUERY PLAN
+--------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: (id < '400'::bigint)
+(5 rows)
+
+SELECT count(*) FROM test_int8_a WHERE id < 400::int8;
+ count
+-------
+ 401
+(1 row)
+
+EXPLAIN (costs off)
+SELECT id, id <=> 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id <=> '400'::bigint))
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id <=> 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 371 | 29
+ 355 | 45
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, id <=| 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id <=| '400'::bigint))
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id <=| 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 371 | 29
+ 355 | 45
+ 354 | 46
+ 252 | 148
+ 232 | 168
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, id |=> 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id |=> '400'::bigint))
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id |=> 400 FROM test_int8_a WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 457 | 57
+ 458 | 58
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::bigint))
+(6 rows)
+
+SELECT id FROM test_int8_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_a WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_int8_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::bigint))
+(6 rows)
+
+SELECT id FROM test_int8_a WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+CREATE TABLE test_int8_h_o AS SELECT id::int8, t FROM tsts;
+CREATE INDEX test_int8_h_o_idx ON test_int8_h_o USING rum
+ (t rum_tsvector_hash_addon_ops, id)
+ WITH (attach = 'id', to = 't');
+RESET enable_seqscan;
+SET enable_indexscan=OFF;
+SET enable_indexonlyscan=OFF;
+SET enable_bitmapscan=OFF;
+SELECT id, id <=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 371 | 29
+ 355 | 45
+(5 rows)
+
+SELECT id, id <=| 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 371 | 29
+ 355 | 45
+ 354 | 46
+ 252 | 148
+ 232 | 168
+(5 rows)
+
+SELECT id, id |=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 457 | 57
+ 458 | 58
+(5 rows)
+
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+RESET enable_indexscan;
+RESET enable_indexonlyscan;
+SET enable_seqscan = off;
+EXPLAIN (costs off)
+SELECT id, id <=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_h_o_idx on test_int8_h_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id <=> '400'::bigint)
+(4 rows)
+
+SELECT id, id <=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id, id <=| 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_h_o_idx on test_int8_h_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id <=| '400'::bigint)
+(4 rows)
+
+SELECT id, id <=| 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id, id |=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------
+ Limit
+ -> Index Scan using test_int8_h_o_idx on test_int8_h_o
+ Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
+ Order By: (id |=> '400'::bigint)
+(4 rows)
+
+SELECT id, id |=> 400 FROM test_int8_h_o WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
+EXPLAIN (costs off)
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_int8_h_o_idx on test_int8_h_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::bigint))
+(4 rows)
+
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_int8_h_o_idx on test_int8_h_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::bigint))
+(4 rows)
+
+SELECT id FROM test_int8_h_o WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+CREATE TABLE test_int8_h_a AS SELECT id::int8, t FROM tsts;
+CREATE INDEX test_int8_h_a_idx ON test_int8_h_a USING rum
+ (t rum_tsvector_hash_addon_ops, id)
+ WITH (attach = 'id', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+EXPLAIN (costs off)
+SELECT count(*) FROM test_int8_h_a WHERE id < 400::int8;
+ QUERY PLAN
+--------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: (id < '400'::bigint)
+(5 rows)
+
+SELECT count(*) FROM test_int8_h_a WHERE id < 400::int8;
+ count
+-------
+ 401
+(1 row)
+
+EXPLAIN (costs off)
+SELECT id, id <=> 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id <=> '400'::bigint))
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id <=> 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id <=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 371 | 29
+ 355 | 45
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, id <=| 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id <=| '400'::bigint))
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id <=| 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id <=| 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 371 | 29
+ 355 | 45
+ 354 | 46
+ 252 | 148
+ 232 | 168
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id, id |=> 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ QUERY PLAN
+---------------------------------------------------------
+ Limit
+ Disabled Nodes: 1
+ -> Sort
+ Disabled Nodes: 1
+ Sort Key: ((id |=> '400'::bigint))
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: (t @@ '''wr'' & ''qh'''::tsquery)
+(8 rows)
+
+SELECT id, id |=> 400 FROM test_int8_h_a WHERE t @@ 'wr&qh' ORDER BY id |=> 400 LIMIT 5;
+ id | ?column?
+-----+----------
+ 406 | 6
+ 415 | 15
+ 428 | 28
+ 457 | 57
+ 458 | 58
+(5 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::bigint))
+(6 rows)
+
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id;
+ id
+-----
+ 16
+ 39
+ 71
+ 135
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+(10 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::bigint))
+(6 rows)
+
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id >= 400::int8 ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+(7 rows)
+
+CREATE TABLE test_int8_id_t AS SELECT id::int8, t FROM tsts;
+CREATE INDEX test_int8_id_t_idx ON test_int8_o USING rum
+ (t rum_tsvector_ops, id);
+EXPLAIN (costs off)
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id <=> 400::int8;
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: ((id <=> '400'::bigint))
+ -> Seq Scan on test_int8_h_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::bigint))
+(6 rows)
+
+SELECT id FROM test_int8_h_a WHERE t @@ 'wr&qh' AND id <= 400::int8 ORDER BY id <=> 400::int8;
+ id
+-----
+ 371
+ 355
+ 354
+ 252
+ 232
+ 168
+ 135
+ 71
+ 39
+ 16
+(10 rows)
+
diff --git a/expected/orderby.out b/expected/orderby.out
index 07ae7322ed..cb3de8aae4 100644
--- a/expected/orderby.out
+++ b/expected/orderby.out
@@ -192,25 +192,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tsts_idx on tsts
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- id | d | ?column?
------+---------------------------------+-------------
- 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
- 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
- 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
- 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
- 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
-(5 rows)
-
EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -262,6 +243,26 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
496 | Sun May 22 11:21:22.326724 2016
(8 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tsts_idx on tsts
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
+ 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
+(5 rows)
+
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -371,25 +372,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tsts_idx on tsts
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- id | d | ?column?
------+---------------------------------+-------------
- 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
- 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
- 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
- 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
- 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
-(5 rows)
-
EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -469,6 +451,26 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
458 | Fri May 20 21:21:22.326724 2016
(3 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tsts_idx on tsts
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
+ 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
+(5 rows)
+
-- Test "ORDER BY" error message
DROP INDEX tsts_idx;
CREATE INDEX tsts_idx ON tsts USING rum (t rum_tsvector_addon_ops, d);
diff --git a/expected/orderby_1.out b/expected/orderby_1.out
index cdd536ac9d..449cae2514 100644
--- a/expected/orderby_1.out
+++ b/expected/orderby_1.out
@@ -192,17 +192,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tsts_idx on tsts
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-ERROR: doesn't support order by over pass-by-reference column
EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -254,6 +243,18 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
496 | Sun May 22 11:21:22.326724 2016
(8 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tsts_idx on tsts
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -340,17 +341,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
ERROR: doesn't support order by over pass-by-reference column
EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tsts_idx on tsts
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-ERROR: doesn't support order by over pass-by-reference column
-EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
@@ -429,6 +419,18 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
458 | Fri May 20 21:21:22.326724 2016
(3 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tsts_idx on tsts
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
-- Test "ORDER BY" error message
DROP INDEX tsts_idx;
CREATE INDEX tsts_idx ON tsts USING rum (t rum_tsvector_addon_ops, d);
diff --git a/expected/orderby_hash.out b/expected/orderby_hash.out
index 782ad5700e..ab94d42395 100644
--- a/expected/orderby_hash.out
+++ b/expected/orderby_hash.out
@@ -192,25 +192,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tstsh_idx on tstsh
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- id | d | ?column?
------+---------------------------------+-------------
- 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
- 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
- 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
- 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
- 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
-(5 rows)
-
EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -262,6 +243,26 @@ SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
496 | Sun May 22 11:21:22.326724 2016
(8 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tstsh_idx on tstsh
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
+ 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
+(5 rows)
+
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -371,25 +372,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tstsh_idx on tstsh
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- id | d | ?column?
------+---------------------------------+-------------
- 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
- 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
- 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
- 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
- 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
-(5 rows)
-
EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -469,6 +451,26 @@ SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
458 | Fri May 20 21:21:22.326724 2016
(3 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tstsh_idx on tstsh
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ id | d | ?column?
+-----+---------------------------------+-------------
+ 355 | Mon May 16 14:21:22.326724 2016 | 2.673276
+ 356 | Mon May 16 15:21:22.326724 2016 | 3597.326724
+ 354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
+ 357 | Mon May 16 16:21:22.326724 2016 | 7197.326724
+ 353 | Mon May 16 12:21:22.326724 2016 | 7202.673276
+(5 rows)
+
-- Test multicolumn index
RESET enable_indexscan;
RESET enable_indexonlyscan;
diff --git a/expected/orderby_hash_1.out b/expected/orderby_hash_1.out
index f19e4507c7..4073025f83 100644
--- a/expected/orderby_hash_1.out
+++ b/expected/orderby_hash_1.out
@@ -192,17 +192,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY
457 | Fri May 20 20:21:22.326724 2016 | 367197.326724
(5 rows)
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tstsh_idx on tstsh
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-ERROR: doesn't support order by over pass-by-reference column
EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
@@ -254,6 +243,18 @@ SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
496 | Sun May 22 11:21:22.326724 2016
(8 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tstsh_idx on tstsh
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -340,17 +341,6 @@ SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
ERROR: doesn't support order by over pass-by-reference column
EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------
- Limit
- -> Index Scan using tstsh_idx on tstsh
- Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
-(3 rows)
-
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-ERROR: doesn't support order by over pass-by-reference column
-EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
@@ -429,6 +419,18 @@ SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER
458 | Fri May 20 21:21:22.326724 2016
(3 rows)
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Limit
+ -> Index Scan using tstsh_idx on tstsh
+ Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
+(3 rows)
+
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+ERROR: doesn't support order by over pass-by-reference column
-- Test multicolumn index
RESET enable_indexscan;
RESET enable_indexonlyscan;
diff --git a/expected/rum.out b/expected/rum.out
index 5966d196fe..d51159b997 100644
--- a/expected/rum.out
+++ b/expected/rum.out
@@ -163,6 +163,7 @@ SELECT
rum_ts_distance(a, to_tsquery('pg_catalog.english', 'way & (go | half)'))::numeric(10,4),
*
FROM test_rum
+ WHERE a @@ to_tsquery('pg_catalog.english', 'way & (go | half)')
ORDER BY a <=> to_tsquery('pg_catalog.english', 'way & (go | half)') limit 2;
distance | rum_ts_distance | t | a
----------+-----------------+---------------------------------------------------------------------+---------------------------------------------------------
diff --git a/expected/rum_hash.out b/expected/rum_hash.out
index 43a9760a28..caa6f44185 100644
--- a/expected/rum_hash.out
+++ b/expected/rum_hash.out
@@ -150,6 +150,7 @@ SELECT
rum_ts_score(a, to_tsquery('pg_catalog.english', 'way & (go | half)'))::numeric(10,6),
*
FROM test_rum_hash
+ WHERE a @@ to_tsquery('pg_catalog.english', 'way & (go | half)')
ORDER BY a <=> to_tsquery('pg_catalog.english', 'way & (go | half)') limit 2;
distance | rum_ts_distance | rum_ts_score | t | a
----------+-----------------+--------------+---------------------------------------------------------------------+---------------------------------------------------------
diff --git a/expected/text.out b/expected/text.out
index 9cf9310a77..36662119ec 100644
--- a/expected/text.out
+++ b/expected/text.out
@@ -1,3 +1,15 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * text.out - test output for PostgreSQL (<18)
+ * text_1.out - for PostgreSQL (>=18)
+ *
+ */
set enable_seqscan=off;
CREATE TABLE test_text (
i text
diff --git a/expected/text_1.out b/expected/text_1.out
new file mode 100644
index 0000000000..bdf8ea478f
--- /dev/null
+++ b/expected/text_1.out
@@ -0,0 +1,337 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * text.out - test output for PostgreSQL (<18)
+ * text_1.out - for PostgreSQL (>=18)
+ *
+ */
+set enable_seqscan=off;
+CREATE TABLE test_text (
+ i text
+);
+INSERT INTO test_text VALUES ('a'),('ab'),('abc'),('abb'),('axy'),('xyz');
+CREATE INDEX idx_text ON test_text USING rum (i);
+SELECT * FROM test_text WHERE i<'abc' ORDER BY i;
+ i
+-----
+ a
+ ab
+ abb
+(3 rows)
+
+SELECT * FROM test_text WHERE i<='abc' ORDER BY i;
+ i
+-----
+ a
+ ab
+ abb
+ abc
+(4 rows)
+
+SELECT * FROM test_text WHERE i='abc' ORDER BY i;
+ i
+-----
+ abc
+(1 row)
+
+SELECT * FROM test_text WHERE i>='abc' ORDER BY i;
+ i
+-----
+ abc
+ axy
+ xyz
+(3 rows)
+
+SELECT * FROM test_text WHERE i>'abc' ORDER BY i;
+ i
+-----
+ axy
+ xyz
+(2 rows)
+
+CREATE TABLE test_text_o AS SELECT id::text, t FROM tsts;
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ id
+-----
+ 135
+ 16
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+ 39
+(9 rows)
+
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+ 71
+(8 rows)
+
+CREATE INDEX test_text_o_idx ON test_text_o USING rum
+ (t rum_tsvector_addon_ops, id)
+ WITH (attach = 'id', to = 't');
+RESET enable_indexscan;
+RESET enable_indexonlyscan;
+SET enable_bitmapscan=OFF;
+SET enable_seqscan = off;
+EXPLAIN (costs off)
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ QUERY PLAN
+---------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_text_o_idx on test_text_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::text))
+(4 rows)
+
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ id
+-----
+ 135
+ 16
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+ 39
+(9 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ QUERY PLAN
+---------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_text_o_idx on test_text_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::text))
+(4 rows)
+
+SELECT id FROM test_text_o WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+ 71
+(8 rows)
+
+CREATE TABLE test_text_a AS SELECT id::text, t FROM tsts;
+-- Should fail, temporarly it isn't allowed to order an index over pass-by-reference column
+CREATE INDEX test_text_a_idx ON test_text_a USING rum
+ (t rum_tsvector_addon_ops, id)
+ WITH (attach = 'id', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+EXPLAIN (costs off)
+SELECT count(*) FROM test_text_a WHERE id < '400';
+ QUERY PLAN
+------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on test_text_a
+ Disabled Nodes: 1
+ Filter: (id < '400'::text)
+(5 rows)
+
+SELECT count(*) FROM test_text_a WHERE id < '400';
+ count
+-------
+ 337
+(1 row)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_a WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_text_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::text))
+(6 rows)
+
+SELECT id FROM test_text_a WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ id
+-----
+ 135
+ 16
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+ 39
+(9 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_a WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_text_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::text))
+(6 rows)
+
+SELECT id FROM test_text_a WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+ 71
+(8 rows)
+
+CREATE TABLE test_text_h_o AS SELECT id::text, t FROM tsts;
+CREATE INDEX test_text_h_o_idx ON test_text_h_o USING rum
+ (t rum_tsvector_hash_addon_ops, id)
+ WITH (attach = 'id', to = 't');
+EXPLAIN (costs off)
+SELECT id FROM test_text_h_o WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ QUERY PLAN
+---------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_text_h_o_idx on test_text_h_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::text))
+(4 rows)
+
+SELECT id FROM test_text_h_o WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ id
+-----
+ 135
+ 16
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+ 39
+(9 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_h_o WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ QUERY PLAN
+---------------------------------------------------------------------------------
+ Sort
+ Sort Key: id
+ -> Index Scan using test_text_h_o_idx on test_text_h_o
+ Index Cond: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::text))
+(4 rows)
+
+SELECT id FROM test_text_h_o WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+ 71
+(8 rows)
+
+CREATE TABLE test_text_h_a AS SELECT id::text, t FROM tsts;
+-- Should fail, temporarly it isn't allowed to order an index over pass-by-reference column
+CREATE INDEX test_text_h_a_idx ON test_text_h_a USING rum
+ (t rum_tsvector_hash_addon_ops, id)
+ WITH (attach = 'id', to = 't', order_by_attach='t');
+ERROR: doesn't support order index over pass-by-reference column
+EXPLAIN (costs off)
+SELECT count(*) FROM test_text_h_a WHERE id < '400';
+ QUERY PLAN
+------------------------------------
+ Aggregate
+ Disabled Nodes: 1
+ -> Seq Scan on test_text_h_a
+ Disabled Nodes: 1
+ Filter: (id < '400'::text)
+(5 rows)
+
+SELECT count(*) FROM test_text_h_a WHERE id < '400';
+ count
+-------
+ 337
+(1 row)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_h_a WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_text_h_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id <= '400'::text))
+(6 rows)
+
+SELECT id FROM test_text_h_a WHERE t @@ 'wr&qh' AND id <= '400' ORDER BY id;
+ id
+-----
+ 135
+ 16
+ 168
+ 232
+ 252
+ 354
+ 355
+ 371
+ 39
+(9 rows)
+
+EXPLAIN (costs off)
+SELECT id FROM test_text_h_a WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ QUERY PLAN
+-----------------------------------------------------------------------------
+ Sort
+ Disabled Nodes: 1
+ Sort Key: id
+ -> Seq Scan on test_text_h_a
+ Disabled Nodes: 1
+ Filter: ((t @@ '''wr'' & ''qh'''::tsquery) AND (id >= '400'::text))
+(6 rows)
+
+SELECT id FROM test_text_h_a WHERE t @@ 'wr&qh' AND id >= '400' ORDER BY id;
+ id
+-----
+ 406
+ 415
+ 428
+ 457
+ 458
+ 484
+ 496
+ 71
+(8 rows)
+
diff --git a/sql/altorder.sql b/sql/altorder.sql
index 850e252325..01789d8172 100644
--- a/sql/altorder.sql
+++ b/sql/altorder.sql
@@ -3,12 +3,15 @@
* NOTE: This test behaves differenly
* ------------------------------------
*
- * altorder.out - test output for 64-bit systems and
- * altorder_1.out - test output for 32-bit systems.
+ * altorder.out - test output for 64-bit systems
+ * altorder_1.out - test output for 32-bit systems
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_2.out - test output for 32-bit systems (>=18)
*
*/
-
-
CREATE TABLE atsts (id int, t tsvector, d timestamp);
\copy atsts from 'data/tsts.data'
diff --git a/sql/altorder_hash.sql b/sql/altorder_hash.sql
index 148407c661..3b9b8121a3 100644
--- a/sql/altorder_hash.sql
+++ b/sql/altorder_hash.sql
@@ -6,6 +6,11 @@
* altorder_hash.out - test output for 64-bit systems and
* altorder_hash_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * altorder_hash_2.out - test output for 32-bit systems (>=18)
+ *
*/
diff --git a/sql/array.sql b/sql/array.sql
index 9eba800bcf..e9c7adb274 100644
--- a/sql/array.sql
+++ b/sql/array.sql
@@ -6,6 +6,12 @@
* array.out - test output for 64-bit systems and
* array_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * array_2.out - test output for 64-bit systems (>=18).
+ * array_3.out - test output for 32-bit systems (>=18).
+ *
*/
diff --git a/sql/int8.sql b/sql/int8.sql
index c51705e62b..a46bb6b7fc 100644
--- a/sql/int8.sql
+++ b/sql/int8.sql
@@ -6,6 +6,11 @@
* int8.out - test output for 64-bit systems and
* int8_1.out - test output for 32-bit systems.
*
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * int8_2.out - test output for 32-bit systems (>=18)
+ *
*/
diff --git a/sql/orderby.sql b/sql/orderby.sql
index a2bd227873..f9ccadf123 100644
--- a/sql/orderby.sql
+++ b/sql/orderby.sql
@@ -54,10 +54,6 @@ EXPLAIN (costs off)
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-
EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
@@ -65,6 +61,11 @@ EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -89,10 +90,6 @@ EXPLAIN (costs off)
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-
EXPLAIN (costs off)
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
@@ -106,6 +103,11 @@ SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
SELECT id, d FROM tsts WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+
-- Test "ORDER BY" error message
DROP INDEX tsts_idx;
diff --git a/sql/orderby_hash.sql b/sql/orderby_hash.sql
index dba8f17ca1..3fa4a79962 100644
--- a/sql/orderby_hash.sql
+++ b/sql/orderby_hash.sql
@@ -54,10 +54,6 @@ EXPLAIN (costs off)
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-
EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
@@ -65,6 +61,11 @@ EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d;
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+
-- Test index scan
RESET enable_indexscan;
RESET enable_indexonlyscan;
@@ -89,10 +90,6 @@ EXPLAIN (costs off)
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
SELECT id, d, d |=> '2016-05-16 14:21:25' FROM tstsh WHERE t @@ 'wr&qh' ORDER BY d |=> '2016-05-16 14:21:25' LIMIT 5;
-EXPLAIN (costs off)
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
-
EXPLAIN (costs off)
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER BY d;
@@ -106,6 +103,11 @@ SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d <= '2016-05-16 14:21:25' ORDER
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d ASC LIMIT 3;
SELECT id, d FROM tstsh WHERE t @@ 'wr&qh' AND d >= '2016-05-16 14:21:25' ORDER BY d DESC LIMIT 3;
+RESET enable_indexscan;
+EXPLAIN (costs off)
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tstsh ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
+
-- Test multicolumn index
RESET enable_indexscan;
diff --git a/sql/rum.sql b/sql/rum.sql
index 8414bb95c5..dc02b22ddd 100644
--- a/sql/rum.sql
+++ b/sql/rum.sql
@@ -64,6 +64,7 @@ SELECT
rum_ts_distance(a, to_tsquery('pg_catalog.english', 'way & (go | half)'))::numeric(10,4),
*
FROM test_rum
+ WHERE a @@ to_tsquery('pg_catalog.english', 'way & (go | half)')
ORDER BY a <=> to_tsquery('pg_catalog.english', 'way & (go | half)') limit 2;
-- Check ranking normalization
diff --git a/sql/rum_hash.sql b/sql/rum_hash.sql
index a33b8fde31..a431e2d130 100644
--- a/sql/rum_hash.sql
+++ b/sql/rum_hash.sql
@@ -53,6 +53,7 @@ SELECT
rum_ts_score(a, to_tsquery('pg_catalog.english', 'way & (go | half)'))::numeric(10,6),
*
FROM test_rum_hash
+ WHERE a @@ to_tsquery('pg_catalog.english', 'way & (go | half)')
ORDER BY a <=> to_tsquery('pg_catalog.english', 'way & (go | half)') limit 2;
-- Check ranking normalization
diff --git a/sql/text.sql b/sql/text.sql
index 1f340b7109..ab81d9d1fd 100644
--- a/sql/text.sql
+++ b/sql/text.sql
@@ -1,3 +1,15 @@
+/*
+ * ------------------------------------
+ * NOTE: This test behaves differenly
+ * ------------------------------------
+ *
+ * Since c01743aa486 (>=18) EXPLAIN output was changed,
+ * now it includes the number of disabled nodes
+ *
+ * text.out - test output for PostgreSQL (<18)
+ * text_1.out - for PostgreSQL (>=18)
+ *
+ */
set enable_seqscan=off;
CREATE TABLE test_text (
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/postgrespro/rum/pull/152.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy