2018-07-20 22:14:41 +00:00
-- Hypothetical index tests
2015-07-11 08:28:34 +00:00
2020-02-22 12:51:50 +00:00
-- Hypothetical index on unexisting table
SELECT COUNT ( * ) AS nb
FROM public . hypopg_create_index ( ' CREATE INDEX ON notatable(meh); ' ) ;
2015-07-11 08:28:34 +00:00
CREATE TABLE hypo ( id integer , val text ) ;
INSERT INTO hypo SELECT i , ' line ' | | i
FROM generate_series ( 1 , 100000 ) f ( i ) ;
ANALYZE hypo ;
-- TESTS
SELECT COUNT ( * ) AS nb
FROM public . hypopg_create_index ( ' SELECT 1;CREATE INDEX ON hypo(id); SELECT 2 ' ) ;
SELECT nspname , relname , amname FROM public . hypopg_list_indexes ( ) ;
2015-09-03 17:02:32 +00:00
-- Should use hypothetical index
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo WHERE id = 1 ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
-- Should use hypothetical index
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo ORDER BY id ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
-- Should not use hypothetical index
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
-- Add predicate index
SELECT COUNT ( * ) AS nb
FROM public . hypopg_create_index ( ' CREATE INDEX ON hypo(id) WHERE id < 5 ' ) ;
-- This specific index should be used
WITH ind AS (
SELECT indexrelid , row_number ( ) OVER ( ORDER BY indexrelid ) AS num
FROM public . hypopg ( )
) ,
regexp AS (
SELECT regexp_replace ( e , ' .*<(\d+)>.* ' , E ' \\1 ' , ' g ' ) AS r
FROM do_explain ( ' SELECT * FROM hypo WHERE id < 3 ' ) AS e
)
SELECT num
FROM ind
JOIN regexp ON ind . indexrelid : : text = regexp . r ;
-- Specify fillfactor
SELECT COUNT ( * ) AS NB
FROM public . hypopg_create_index ( ' CREATE INDEX ON hypo(id) WITH (fillfactor = 10) ' ) ;
-- Specify an incorrect fillfactor
SELECT COUNT ( * ) AS NB
FROM public . hypopg_create_index ( ' CREATE INDEX ON hypo(id) WITH (fillfactor = 1) ' ) ;
-- Index size estimation
2018-03-27 17:48:41 +00:00
SELECT hypopg_relation_size ( indexrelid ) = current_setting ( ' block_size ' ) : : bigint AS one_block
2015-09-03 17:02:32 +00:00
FROM hypopg ( )
ORDER BY indexrelid ;
2015-09-14 15:49:33 +00:00
-- locally disable hypoopg
SET hypopg . enabled to false ;
-- no hypothetical index should be used
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo WHERE id = 1 ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
-- locally re-enable hypoopg
SET hypopg . enabled to true ;
-- hypothetical index should be used
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo WHERE id = 1 ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
2015-09-03 17:02:32 +00:00
-- Remove one hypothetical index
SELECT hypopg_drop_index ( indexrelid ) FROM hypopg ( ) ORDER BY indexrelid LIMIT 1 ;
-- Remove all the hypothetical indexes
SELECT hypopg_reset ( ) ;
2016-06-07 18:10:04 +00:00
2016-11-15 14:17:26 +00:00
-- index on expression
SELECT COUNT ( * ) AS NB
FROM public . hypopg_create_index ( ' CREATE INDEX ON hypo (md5(val)) ' ) ;
-- Should use hypothetical index
SELECT COUNT ( * ) FROM do_explain ( ' SELECT * FROM hypo WHERE md5(val) = md5( '' line 1 '' ) ' ) e
WHERE e ~ ' Index.*<\d+>btree_hypo.* ' ;
2016-11-16 22:49:27 +00:00
-- Deparse an index DDL, with almost every possible pathcode
2017-09-05 04:45:31 +00:00
SELECT hypopg_get_indexdef ( indexrelid ) FROM hypopg_create_index ( ' create index on hypo using btree(id desc, id desc nulls first, id desc nulls last, cast(md5(val) as bpchar) bpchar_pattern_ops) with (fillfactor = 10) WHERE id < 1000 AND id +1 %2 = 3 ' ) ;