blob: da32900afdc0e52f62c0e592da4f50d923f8fc5e [file] [log] [blame]
-- Test suite for appendonly default storage parameters.
--
-- Scope: database, role and session level defaults.
drop database if exists dsp1;
create database dsp1;
alter database dsp1 set default_table_access_method = ao_column;
drop database if exists dsp2;
create database dsp2;
alter database dsp2 set default_table_access_method = ao_row;
alter database dsp2 set gp_default_storage_options = "checksum=true";
-- Testing pg_authid.rolconfig is currently deferred in
-- installcheck-good because it becomes contrived. These tests will
-- be covered in detail in Divya's test plan for default storage
-- options.
--
-- drop role if exists dsprole1;
-- create role dsprole1 with login;
-- drop role if exists dsprole2;
-- create role dsprole2 with login;
-- -- Allow all users to login from local host.
-- \! cp $(psql -d postgres -t -c "show data_directory")/pg_hba.conf /tmp/
-- \! echo "local all all trust" >> /tmp/pg_hba.conf
-- \! cp /tmp/pg_hba.conf $(psql -d postgres -t -c "show data_directory")/pg_hba.conf
-- \! gpstop -qau
-- alter role dsprole1 set gp_default_storage_options to
-- "blocksize=8192";
-- alter role dsprole2 set gp_default_storage_options to
-- "compresslevel=2";
--
-- \c dsp1 dsprole2
--
-- Leaving roles around affects others, e.g. auth_constraints.sql.
-- Therefore drop them in the end.
\c dsp1
show default_table_access_method;
show gp_default_storage_options;
create table t1 (a int, b int) distributed by (a);
\d+ t1
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 't1';
insert into t1 select i, i from generate_series(1,5)i;
update t1 set b = 50 where a < 50;
set default_table_access_method = ao_column;
set gp_default_storage_options = "blocksize=8192";
show default_table_access_method;
show gp_default_storage_options;
create table t2 (a int, b varchar, c text) distributed by (a);
\d+ t2
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 't2';
create table t3 (a int, b float) with (appendonly=false)
distributed by (a);
\d+ t3
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 't3';
create table t4 (a int, b float, c text) with
(appendonly=true,orientation=row) distributed by (a);
-- Set default access method to heap, verify basic operations.
set default_table_access_method="heap";
show gp_default_storage_options;
create table h1 (a int, b int) distributed by (a);
create index ih1 on h1(a);
insert into h1 select i, i*2 from generate_series(1,50)i;
set enable_seqscan=off;
show enable_seqscan;
select * from h1 where a > 5 and a < 10 order by a,b;
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relkind='r' and c.relnamespace=2200 order by relname;
select relid::regclass, blocksize, compresstype,
compresslevel, columnstore, checksum from pg_appendonly order by 1;
\c dsp2
set default_table_access_method = ao_row;
set gp_default_storage_options = "compresslevel=2,checksum=true";
show default_table_access_method;
show gp_default_storage_options;
create table t1 (a int, b int) distributed by (a);
\d+ t1
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 't1';
-- should fail because current default access method is not aoco
create table t2 (
a int encoding(blocksize=65536),
b float encoding(compresstype=zlib),
c int encoding(compresstype=rle_type, compresslevel=2),
d text
) distributed by (a);
-- should succeed
create table t2 (
a int encoding(blocksize=65536),
b float encoding(compresstype=zlib),
c int encoding(compresstype=rle_type, compresslevel=2),
d text
) with (appendonly=true,orientation=column) distributed by (a);
\d+ t2
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 't2';
insert into t2 select i, 71/i, 2*i, 'abc'||2*i from generate_series(1,5)i;
select * from t2 order by 1;
select attrelid::regclass, attnum, filenum, attoptions
from pg_attribute_encoding order by 1,2;
-- SET operation in a session has higher precedence. Also test if
-- compresstype is correctly inferred based on compress level.
set default_table_access_method = ao_row;
set gp_default_storage_options = "compresslevel=4,checksum=false";
show default_table_access_method;
show gp_default_storage_options;
create table t3 (a int, b int, c text) distributed by (a);
insert into t3 select i, i, 'abc' from generate_series(1,5)i;
select * from t3 order by 1;
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname in ('t1', 't2', 't3') order by 1;
select relid::regclass, blocksize, compresstype,
compresslevel, columnstore, checksum from pg_appendonly order by 1;
-- The GUC has checksum=false. Test that you can still turn it in WITH, and
-- that it affects partitions and subpartitions, too.
Create table alter_part_tab1 (id SERIAL,a1 int ,a2 char(5) ,a3 text )
WITH (appendonly=true, orientation=column, checksum=true,compresstype=zlib)
partition by list(a2) subpartition by range(a1)
(partition p1 values('val1')
(default subpartition subothers,
subpartition sp1 start(1) end(9) with (appendonly=true,orientation=column,checksum=true,compresstype=rle_type),
subpartition sp2 start(11) end(20) with(appendonly=true,orientation=column,checksum=true,compresstype=none)),
partition p2 values('val2')
(default subpartition subothers,
subpartition sp1 start(1) end(9) with (appendonly=true,orientation=column,checksum=true,compresstype=rle_type),
subpartition sp2 start(11) end(20) with(appendonly=true,orientation=column,checksum=true,compresstype=none))
);
Insert into alter_part_tab1(a1,a2,a3)
select g, 'val1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' from generate_series(1,10) g;
Insert into alter_part_tab1(a1,a2,a3)
select g, 'val1', 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.' from generate_series(11, 20) g;
select count(*) from alter_part_tab1;
-- Make sure that adding a column doesn't affect checksums.
alter table alter_part_tab1 add column a4 numeric default 5.5;
-- Check that it works for ADD PARTITION, too.
ALTER TABLE alter_part_tab1 ADD partition p31 values(1) WITH (appendonly=true, orientation=column, checksum=true,compresstype=zlib)
(default subpartition subothers,
subpartition sp1 start(1) end(9) with (appendonly=true,orientation=column,checksum=true,compresstype=rle_type),
subpartition sp2 start(11) end(20) with(appendonly=true,orientation=column,checksum=true,compresstype=none));
SELECT relname, checksum from pg_appendonly ao, pg_class c where ao.relid = c.oid and relname like 'alter_part_tab1%';
drop table alter_part_tab1;
-- attribute encoding tests for column oriented tables
set default_table_access_method = ao_column;
set gp_default_storage_options = "compresslevel=1";
show default_table_access_method;
show gp_default_storage_options;
create table co1 (a int, b int) distributed by (a);
create table co2 (a int, b int) with (blocksize=8192)
distributed by (a);
create table co3 (
a int encoding(blocksize=65536),
b float encoding(compresstype=zlib,compresslevel=6),
c char encoding(compresstype=rle_type))
distributed by(a);
create table co4 (a int, b int, c varchar,
default column encoding (compresslevel=5))
distributed by (a);
create table co5 (a int, b int, c varchar encoding(compresslevel=0),
default column encoding (compresslevel=5))
distributed by (a);
create table co6(a char, b bytea, c float, d int,
default column encoding (compresstype=RLE_TYPE))
with (checksum=true) distributed by (a);
create table co7(
a int encoding(blocksize=8192,compresstype=none),
b varchar encoding(compresstype=zlib,compresslevel=6),
c char encoding(compresstype=rle_type))
with (checksum=false) distributed by (a);
select attrelid::regclass,attnum,filenum,attoptions
from pg_attribute_encoding order by 1,2;
drop database if exists dsp3;
create database dsp3;
\c dsp3
set default_table_access_method = ao_column;
set gp_default_storage_options = "compresslevel=0";
show default_table_access_method;
show gp_default_storage_options;
create table co1(
a int encoding (compresstype=rle_type),
b float encoding (compresslevel=5),
c char encoding (compresslevel=0,blocksize=65536),
d float) distributed by (a);
set gp_default_storage_options= "compresslevel=3";
show gp_default_storage_options;
create table co2(
a int encoding (compresstype=rle_type),
b float encoding (compresslevel=5),
c char encoding (compresslevel=0,blocksize=65536),
d float,
default column encoding (compresstype=none))
distributed by (a);
-- attribute encoding should be set correctly.
set default_table_access_method = "heap";
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
show default_table_access_method;
show gp_default_storage_options;
create table co3 (a int, b float) with (appendonly=true, orientation=column) distributed by (a);
create table co4 (a int encoding (blocksize=8192), b int) distributed by (a);
set default_table_access_method = ao_row;
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
create table co5 (a int encoding (blocksize=8192), b float)
with (appendonly=true,orientation=column, checksum=false) distributed by (a);
select c.relname, am.amname, c.relkind, c.reloptions from pg_class c left join pg_am am on (c.relam=am.oid)
where relname in ('co1', 'co2', 'co3', 'co5') order by 1;
select attrelid::regclass,attnum,filenum,attoptions
from pg_attribute_encoding order by 1,2;
-- misc tests
alter database dsp1 set default_table_access_method = "heap";
\c dsp1
show default_table_access_method;
show gp_default_storage_options;
\c dsp3
alter database dsp1 set default_table_access_method = ao_row;
alter database dsp1 set gp_default_storage_options = "compresstype=zlib";
\c dsp1
set default_table_access_method = ao_column;
show gp_default_storage_options;
set gp_default_storage_options = "compresstype=rle_type";
show gp_default_storage_options;
set gp_default_storage_options = "compresslevel=0";
show gp_default_storage_options;
set gp_default_storage_options = "checksum=false";
show gp_default_storage_options;
\c dsp3
set default_table_access_method = ao_column;
set gp_default_storage_options = "compresslevel=5";
show gp_default_storage_options;
-- negative tests - should fail due to invalid combinations of
-- compresslevel and compresstype.
create table co6(
a int encoding (compresstype=rle_type),
b float encoding (blocksize=8192))
distributed by (a);
create table co7(a int, b float,
default column encoding (compresstype=RLE_TYPE, compresslevel=7))
distributed by (a);
-- negative tests - session level set
set gp_default_storage_options = "compresstype=zlib,compresslevel=11";
set gp_default_storage_options = "compresslevel=5,compresstype=RLE_TYPE";
set gp_default_storage_options = "compresslevel=1,compresstype=rle";
set gp_default_storage_options = "checksum=1234";
set gp_default_storage_options = "blocksize=true";
set gp_default_storage_options = 'blocksize=8192,checksumblah=true';
show gp_default_storage_options;
-- negative tests - database level
alter database dsp1 set gp_default_storage_options = "compresslevel=-12";
alter database dsp1 set gp_default_storage_options = "checksum=invalid";
alter database dsp1 set gp_default_storage_options = "compresstype=zlib,compresslevel=0";
-- set_config() tests
select pg_catalog.set_config('default_table_access_method', 'ao_column', false);
show default_table_access_method;
select pg_catalog.set_config('gp_default_storage_options', 'compresstype=none', false);
show gp_default_storage_options;
create table co8 (a int, b float) distributed by (a);
\d+ co8
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'co8';
-- ensure that set_config() has propagated to segments by insert and
-- select into a column oriented table.
insert into co8 select i, i/2 from generate_series(1,10)i;
select count(b) from co8;
select pg_catalog.set_config('gp_default_storage_options', 'compresstype=rle_type,compresslevel=1', false);
show gp_default_storage_options;
begin;
select pg_catalog.set_config('gp_default_storage_options', 'compresslevel=2', true);
show gp_default_storage_options;
create table ao1 (a int, b int) with (appendonly=true) distributed by (a);
\d+ ao1;
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'ao1';
insert into ao1 select i, i from generate_series(1,100)i;
select count(*) from ao1;
end;
-- GUC should be reset after end of transaction.
show gp_default_storage_options;
-- verify reset happendon on segments by create, insert, select.
create table co9 (x int, y float) distributed by (x);
\d+ co9
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'co9';
-- ensure that set_config() has propagated to segments by insert and
-- select into a column oriented table.
insert into co9 select i, i/2 from generate_series(1,10)i;
select count(y) from co9;
set gp_default_storage_options='compresstype=none';
show gp_default_storage_options;
-- compresstype should be correctly inferred.
create table ao2 (a int, b int) with
(appendonly=true, compresslevel=4) distributed by (a);
\d ao2
-- MPP-25073 verify if compresstype=none is represented as NULL.
set gp_default_storage_options='';
create table ao4 (a int, b int) with (appendonly=true)
distributed by (a);
\d ao4
select amname, reloptions from pg_class left join pg_am on pg_am.oid = relam where relname = 'ao4';
select compresstype from pg_appendonly where relid = 'ao4'::regclass;
set default_table_access_method = ao_row;
set gp_default_storage_options = "compresstype=NONE";
create table co10 (a int, b int, c int) with (appendonly=true,orientation=column)
distributed by (a);
select attnum,filenum,attoptions from pg_attribute_encoding
where attrelid = 'co10'::regclass order by attnum;
select compresstype from pg_appendonly where relid = 'co10'::regclass;
-- compression disabled by default, enable in WITH clause
set default_table_access_method = ao_row;
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
show gp_default_storage_options;
-- compresstype only
create table ao5 (a int, b int) with (compresstype=zlib)
distributed by (a);
\d ao5
insert into ao5 select i, i from generate_series(1,10)i;
-- compresslevel only
create table ao6 with (compresslevel=4) as select * from ao5
distributed by (a);
\d ao6
-- both compresstype and compresslevel
create table ao7 with (compresstype=zlib, compresslevel=3) as
select * from ao6 distributed by (a);
\d ao7
-- compression enabled by default, disable in WITH clause
set gp_default_storage_options = "compresstype=zlib";
set default_table_access_method = ao_row;
show gp_default_storage_options;
-- compresstype only
create table ao8 with (compresstype=none) as select * from ao7
distributed by (a);
\d ao8
-- compresslevel only (should fail)
create table ao9 with (compresslevel=0) as select * from ao8
distributed by (a);
create table ao10 with (compresslevel=0, compresstype=none)
as select * from ao8 distributed by (a);
-- MPP-14504: we need to allow compresstype=none with compresslevel>0
create table ao11 (a int, b int) with (compresstype=none, compresslevel=2)
distributed by (a);
\d ao11
set gp_default_storage_options='compresstype=none,compresslevel=2';
show gp_default_storage_options;
create table ao12 (a int, b int) with (appendonly=true) distributed by (a);
\d ao12
--bitmap index
set default_table_access_method = ao_row;
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
create table bitmap_table(a int, b int, c varchar);
create index bitmap_i on bitmap_table using bitmap(b);
-- external tables: ensure that default access methods are ignored
-- during external table creation.
set default_table_access_method = ao_row;
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
create external table ext_t1 (a int, b int)
location ('file:///tmp/test.txt') format 'text';
\d+ ext_t1
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'ext_t1';
create external table ext_error_logging_off (a int, b int)
location ('file:///tmp/test.txt') format 'text'
segment reject limit 100;
\d+ ext_error_logging_off
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'ext_error_logging_off';
create external table ext_t2 (a int, b int)
location ('file:///tmp/test.txt') format 'text'
log errors segment reject limit 100;
\d+ ext_t2
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'ext_t2';
create external table ext_t3 (a int, b int)
location ('file:///tmp/test.txt') format 'text'
log errors persistently segment reject limit 100;
\d+ ext_t3
SELECT am.amname FROM pg_class c LEFT JOIN pg_am am ON (c.relam = am.oid) WHERE c.relname = 'ext_t3';
-- Make sure gp_default_storage_options GUC value is set in newly created cdbgangs
-- after previous idle cdbgang is stopped
SET gp_vmem_idle_resource_timeout=30;
set default_table_access_method = ao_row;
SET gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=false";
\! sleep 1
CREATE TABLE check_guc_value_after_new_cdbgang (a int) DISTRIBUTED RANDOMLY;
SELECT DISTINCT relid::regclass FROM pg_appendonly WHERE relid='check_guc_value_after_new_cdbgang'::regclass;
SELECT DISTINCT relid::regclass FROM gp_dist_random('pg_appendonly') WHERE relid='check_guc_value_after_new_cdbgang'::regclass;
SELECT DISTINCT relname, reloptions FROM pg_class WHERE relname='check_guc_value_after_new_cdbgang';
SELECT DISTINCT relname, reloptions FROM gp_dist_random('pg_class') WHERE relname='check_guc_value_after_new_cdbgang';
RESET gp_vmem_idle_resource_timeout;
-- Make sure ALTER TABLE REORGANIZE does not change the table type due
-- to gp_default_storage_options GUC
set default_table_access_method = ao_row;
set gp_default_storage_options = "blocksize=32768";
create table alter_table_reorg_ao (a int, b text);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'alter_table_reorg_ao';
set default_table_access_method = ao_column;
set gp_default_storage_options = "blocksize=32768";
alter table alter_table_reorg_ao set with (reorganize=true);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'alter_table_reorg_ao';
set default_table_access_method = ao_column;
set gp_default_storage_options = "blocksize=32768";
create table alter_table_reorg_aoco (a int, b text);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'alter_table_reorg_aoco';
set default_table_access_method = "heap";
set gp_default_storage_options = "blocksize=32768";
alter table alter_table_reorg_aoco set with (reorganize=true);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'alter_table_reorg_aoco';
-- Make sure SELECT INTO uses gp_default_storage_options GUC
create table select_into_heap_from (a int, b text);
insert into select_into_heap_from select i, 'aaa' from generate_series(1,50)i;
set default_table_access_method = ao_column;
set gp_default_storage_options = "blocksize=32768";
select * into select_into_heap_to from select_into_heap_from;
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'select_into_heap_to';
select count(*) from select_into_heap_to;
-- Also check CTAS works fine
create table ctas_ao_from_heap as select * from select_into_heap_from;
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname = 'ctas_ao_from_heap';
select count(*) from ctas_ao_from_heap;
RESET gp_default_storage_options;
create table dsp_partition1(i int, j int, k int) with(appendonly=true) partition by range(i) (start(1) end(10) every(5));
Insert into dsp_partition1 select i, i+1, i+2 from generate_series(1,9) i;
select count(*) from dsp_partition1;
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname like 'dsp_partition1%' order by relname;
select compresslevel, compresstype, blocksize, checksum, columnstore from pg_appendonly
where relid in (select oid from pg_class where relname like 'dsp_partition1%') order by columnstore;
set default_table_access_method = ao_column;
set gp_default_storage_options = "blocksize=32768,compresstype=none,checksum=true";
-- Add partition
alter table dsp_partition1 add partition p3 start(11) end(15);
alter table dsp_partition1 add partition p4 start(16) end(18) with(appendonly=false);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname like 'dsp_partition1%' order by relname;
-- Split partition
alter table dsp_partition1 split partition for (6) at (7) into (partition split_p1, partition split_p2);
select c.relname, am.amname, c.relkind, c.reloptions
from pg_class c left join pg_am am on (c.relam = am.oid)
where c.relname like 'dsp_partition1%' order by relname;
RESET gp_default_storage_options;
-- cleanup
\c postgres
-- Test that gp_default_storage_options option must be the same on all nodes
-- NOTE: although gpconfig might have unittest to verity this, the GUC
-- gp_default_storage_options is so important that adding tests for it here
-- do no harm.
-- start_matchsubs
-- m/.*\[ERROR\]*/
-- s/.*\[ERROR\]/[ERROR]/gm
-- end_matchsubs
\!gpconfig -c gp_default_storage_options -v 'checksum=false' --masteronly
\!gpconfig -c gp_default_storage_options -v 'checksum=false' -m 'checksum=true'
\!gpconfig -s gp_default_storage_options