@@ -12,8 +12,8 @@ SELECT pathman.create_hash_partitions('test.hash_rel', 'value', 3);
1212ERROR: Partitioning key 'value' must be NOT NULL
1313ALTER TABLE test.hash_rel ALTER COLUMN value SET NOT NULL;
1414SELECT pathman.create_hash_partitions('test.hash_rel', 'Value', 3);
15- NOTICE: function test.hash_rel_hash_insert_trigger_func () does not exist, skipping
16- NOTICE: function test.hash_rel_hash_update_trigger_func () does not exist, skipping
15+ NOTICE: function test.hash_rel_insert_trigger_func () does not exist, skipping
16+ NOTICE: function test.hash_rel_update_trigger_func () does not exist, skipping
1717NOTICE: Copying data to partitions...
1818 create_hash_partitions
1919------------------------
@@ -340,6 +340,26 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.num_range_rel WHERE (id >= 500 AND id < 1
340340 -> Seq Scan on num_range_rel_4
341341(8 rows)
342342
343+ EXPLAIN (COSTS OFF) SELECT * FROM test.num_range_rel ORDER BY id;
344+ QUERY PLAN
345+ ----------------------------------------------------------------
346+ Append
347+ -> Index Scan using num_range_rel_1_pkey on num_range_rel_1
348+ -> Index Scan using num_range_rel_2_pkey on num_range_rel_2
349+ -> Index Scan using num_range_rel_3_pkey on num_range_rel_3
350+ -> Index Scan using num_range_rel_4_pkey on num_range_rel_4
351+ (5 rows)
352+
353+ EXPLAIN (COSTS OFF) SELECT * FROM test.num_range_rel WHERE id <= 2500 ORDER BY id;
354+ QUERY PLAN
355+ ----------------------------------------------------------------
356+ Append
357+ -> Index Scan using num_range_rel_1_pkey on num_range_rel_1
358+ -> Index Scan using num_range_rel_2_pkey on num_range_rel_2
359+ -> Index Scan using num_range_rel_3_pkey on num_range_rel_3
360+ Index Cond: (id <= 2500)
361+ (5 rows)
362+
343363EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt > '2015-02-15';
344364 QUERY PLAN
345365------------------------------------------------------------------------------------
@@ -380,6 +400,138 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE (dt >= '2015-01-15' AND d
380400 -> Seq Scan on range_rel_4
381401(8 rows)
382402
403+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel ORDER BY dt;
404+ QUERY PLAN
405+ ----------------------------------------------------------
406+ Append
407+ -> Index Scan using range_rel_1_dt_idx on range_rel_1
408+ -> Index Scan using range_rel_2_dt_idx on range_rel_2
409+ -> Index Scan using range_rel_3_dt_idx on range_rel_3
410+ -> Index Scan using range_rel_4_dt_idx on range_rel_4
411+ (5 rows)
412+
413+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt >= '2015-01-15' ORDER BY dt DESC;
414+ QUERY PLAN
415+ -------------------------------------------------------------------------------------
416+ Append
417+ -> Index Scan Backward using range_rel_4_dt_idx on range_rel_4
418+ -> Index Scan Backward using range_rel_3_dt_idx on range_rel_3
419+ -> Index Scan Backward using range_rel_2_dt_idx on range_rel_2
420+ -> Index Scan Backward using range_rel_1_dt_idx on range_rel_1
421+ Index Cond: (dt >= 'Thu Jan 15 00:00:00 2015'::timestamp without time zone)
422+ (6 rows)
423+
424+ /*
425+ * Sorting
426+ */
427+ SET enable_indexscan = OFF;
428+ SET enable_seqscan = ON;
429+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt < '2015-03-01' ORDER BY dt;
430+ QUERY PLAN
431+ -------------------------------------
432+ Sort
433+ Sort Key: range_rel_1.dt
434+ -> Append
435+ -> Seq Scan on range_rel_1
436+ -> Seq Scan on range_rel_2
437+ (5 rows)
438+
439+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel_1 UNION ALL SELECT * FROM test.range_rel_2 ORDER BY dt;
440+ QUERY PLAN
441+ -------------------------------------
442+ Sort
443+ Sort Key: range_rel_1.dt
444+ -> Append
445+ -> Seq Scan on range_rel_1
446+ -> Seq Scan on range_rel_2
447+ (5 rows)
448+
449+ SET enable_indexscan = ON;
450+ SET enable_seqscan = OFF;
451+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt < '2015-03-01' ORDER BY dt;
452+ QUERY PLAN
453+ ----------------------------------------------------------
454+ Append
455+ -> Index Scan using range_rel_1_dt_idx on range_rel_1
456+ -> Index Scan using range_rel_2_dt_idx on range_rel_2
457+ (3 rows)
458+
459+ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel_1 UNION ALL SELECT * FROM test.range_rel_2 ORDER BY dt;
460+ QUERY PLAN
461+ ----------------------------------------------------------
462+ Merge Append
463+ Sort Key: range_rel_1.dt
464+ -> Index Scan using range_rel_1_dt_idx on range_rel_1
465+ -> Index Scan using range_rel_2_dt_idx on range_rel_2
466+ (4 rows)
467+
468+ /*
469+ * Join
470+ */
471+ SET enable_hashjoin = OFF;
472+ SET enable_mergejoin = ON;
473+ EXPLAIN (COSTS OFF)
474+ SELECT * FROM test.range_rel j1
475+ JOIN test.range_rel j2 on j2.id = j1.id
476+ JOIN test.num_range_rel j3 on j3.id = j1.id
477+ WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
478+ QUERY PLAN
479+ -------------------------------------------------------------------------------------------
480+ Sort
481+ Sort Key: j2.dt
482+ -> Merge Join
483+ Merge Cond: (j3.id = j2.id)
484+ -> Append
485+ -> Index Scan using num_range_rel_1_pkey on num_range_rel_1 j3
486+ -> Index Scan using num_range_rel_2_pkey on num_range_rel_2 j3_1
487+ -> Index Scan using num_range_rel_3_pkey on num_range_rel_3 j3_2
488+ -> Index Scan using num_range_rel_4_pkey on num_range_rel_4 j3_3
489+ -> Materialize
490+ -> Merge Join
491+ Merge Cond: (j2.id = j1.id)
492+ -> Merge Append
493+ Sort Key: j2.id
494+ -> Index Scan using range_rel_2_pkey on range_rel_2 j2
495+ -> Index Scan using range_rel_3_pkey on range_rel_3 j2_1
496+ -> Index Scan using range_rel_4_pkey on range_rel_4 j2_2
497+ -> Materialize
498+ -> Merge Append
499+ Sort Key: j1.id
500+ -> Index Scan using range_rel_1_pkey on range_rel_1 j1
501+ -> Index Scan using range_rel_2_pkey on range_rel_2 j1_1
502+ (22 rows)
503+
504+ SET enable_hashjoin = ON;
505+ SET enable_mergejoin = OFF;
506+ EXPLAIN (COSTS OFF)
507+ SELECT * FROM test.range_rel j1
508+ JOIN test.range_rel j2 on j2.id = j1.id
509+ JOIN test.num_range_rel j3 on j3.id = j1.id
510+ WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
511+ QUERY PLAN
512+ -------------------------------------------------------------------------------------------
513+ Sort
514+ Sort Key: j2.dt
515+ -> Hash Join
516+ Hash Cond: (j3.id = j2.id)
517+ -> Append
518+ -> Index Scan using num_range_rel_1_pkey on num_range_rel_1 j3
519+ -> Index Scan using num_range_rel_2_pkey on num_range_rel_2 j3_1
520+ -> Index Scan using num_range_rel_3_pkey on num_range_rel_3 j3_2
521+ -> Index Scan using num_range_rel_4_pkey on num_range_rel_4 j3_3
522+ -> Hash
523+ -> Hash Join
524+ Hash Cond: (j2.id = j1.id)
525+ -> Append
526+ -> Index Scan using range_rel_2_dt_idx on range_rel_2 j2
527+ -> Index Scan using range_rel_3_dt_idx on range_rel_3 j2_1
528+ -> Index Scan using range_rel_4_dt_idx on range_rel_4 j2_2
529+ -> Hash
530+ -> Append
531+ -> Index Scan using range_rel_1_pkey on range_rel_1 j1
532+ -> Index Scan using range_rel_2_pkey on range_rel_2 j1_1
533+ (20 rows)
534+
383535/*
384536 * Test CTE query
385537 */
@@ -600,15 +752,26 @@ CREATE TABLE test.range_rel_test2 (
600752 dt TIMESTAMP);
601753SELECT pathman.attach_range_partition('test.range_rel', 'test.range_rel_test2', '2013-01-01'::DATE, '2014-01-01'::DATE);
602754ERROR: Partition must have the exact same structure as parent P0001
755+ /*
756+ * Check that altering table columns doesn't break trigger
757+ */
758+ ALTER TABLE test.hash_rel ADD COLUMN abc int;
759+ INSERT INTO test.hash_rel (id, value, abc) VALUES (123, 456, 789);
760+ SELECT * FROM test.hash_rel WHERE id = 123;
761+ id | value | abc
762+ -----+-------+-----
763+ 123 | 456 | 789
764+ (1 row)
765+
603766/*
604767 * Clean up
605768 */
606769SELECT pathman.drop_hash_partitions('test.hash_rel');
607770NOTICE: drop cascades to trigger test_hash_rel_insert_trigger on table test.hash_rel
608- NOTICE:function test.hash_rel_hash_update_trigger_func() does not exist, skipping
771+ NOTICE:drop cascades to 3 other objects
609772NOTICE: 2 rows copied from test.hash_rel_2
610773NOTICE: 3 rows copied from test.hash_rel_1
611- NOTICE:1 rows copied from test.hash_rel_0
774+ NOTICE:2 rows copied from test.hash_rel_0
612775 drop_hash_partitions
613776----------------------
614777 3
@@ -617,12 +780,12 @@ NOTICE: 1 rows copied from test.hash_rel_0
617780SELECT COUNT(*) FROM ONLY test.hash_rel;
618781 count
619782-------
620- 6
783+ 7
621784(1 row)
622785
623786SELECT pathman.create_hash_partitions('test.hash_rel', 'value', 3);
624- NOTICE: function test.hash_rel_hash_insert_trigger_func () does not exist, skipping
625- NOTICE: function test.hash_rel_hash_update_trigger_func () does not exist, skipping
787+ NOTICE: function test.hash_rel_insert_trigger_func () does not exist, skipping
788+ NOTICE: function test.hash_rel_update_trigger_func () does not exist, skipping
626789NOTICE: Copying data to partitions...
627790 create_hash_partitions
628791------------------------
@@ -631,7 +794,7 @@ NOTICE: Copying data to partitions...
631794
632795SELECT pathman.drop_hash_partitions('test.hash_rel', TRUE);
633796NOTICE: drop cascades to trigger test_hash_rel_insert_trigger on table test.hash_rel
634- NOTICE: function test.hash_rel_hash_update_trigger_func () does not exist, skipping
797+ NOTICE: function test.hash_rel_update_trigger_func () does not exist, skipping
635798 drop_hash_partitions
636799----------------------
637800 3
@@ -770,8 +933,8 @@ CREATE TABLE hash_rel (
770933valueINTEGER NOT NULL);
771934INSERT INTO hash_rel (value) SELECT g FROM generate_series(1, 10000) as g;
772935SELECT create_hash_partitions('hash_rel', 'value', 3);
773- NOTICE: functionhash_rel_hash_insert_trigger_func () does not exist, skipping
774- NOTICE: functionhash_rel_hash_update_trigger_func () does not exist, skipping
936+ NOTICE: functionhash_rel_insert_trigger_func () does not exist, skipping
937+ NOTICE: functionhash_rel_update_trigger_func () does not exist, skipping
775938NOTICE: Copying data to partitions...
776939 create_hash_partitions
777940------------------------