blob: baccc05a674fd41bb2d3f7c47f551dbf9ad022fe [file] [log] [blame]
-- Test ALTER TABLE ADD COLUMN / DROP COLUMN, on AOCO tables, with different
-- storage options.
-- Setup test tables
-- AOCO multiple insert to create multiple var-block
DROP TABLE IF EXISTS multivarblock_tab;
CREATE TABLE multivarblock_tab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column) DISTRIBUTED BY (c_custkey);
insert into multivarblock_tab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multivarblock_tab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
insert into multivarblock_tab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
-- AOCO multiple insert to create multiple var-block for table with btree index
DROP TABLE IF EXISTS multivarblock_bitab;
CREATE TABLE multivarblock_bitab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column) DISTRIBUTED BY (c_custkey);
CREATE INDEX multivarblock_btree_idx ON multivarblock_bitab USING btree (c_custkey);
insert into multivarblock_bitab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multivarblock_bitab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
insert into multivarblock_bitab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
-- AOCO multiple insert to create multiple var-block for table with partitions
DROP TABLE IF EXISTS multivarblock_parttab;
CREATE TABLE multivarblock_parttab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column) DISTRIBUTED BY (c_custkey)
partition by range(c_custkey) subpartition by range( c_rating)
subpartition template ( default subpartition subothers,start (0.0) end(1.9) every (2.0) )
(default partition others, partition p1 start(1) end(5000), partition p2 start(5000) end(10000), partition p3 start(10000) end(15000));
insert into multivarblock_parttab values( 1, 'aa','this is a looong text' , 4.5, '12121212',1000.34,'2015/10/10',now());
insert into multivarblock_parttab values( 2, 'ab','this is also a looong text' , 7.5, '3456789',3000.45,'2014/08/10',now());
insert into multivarblock_parttab values( 3, 'ac','this too is a looong text' , 1.5, '878787',4000.25,'2014/08/10',now());
-- AOCO multiple insert to create multiple var-block
DROP TABLE IF EXISTS multivarblock_toast;
CREATE TABLE multivarblock_toast (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column) DISTRIBUTED BY (c_custkey);
insert into multivarblock_toast values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multivarblock_toast values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
insert into multivarblock_toast values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
-- AOCO multiple insert to create multiple var-block
DROP TABLE IF EXISTS multivarblock_zlibtab;
CREATE TABLE multivarblock_zlibtab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=9) DISTRIBUTED BY (c_custkey);
insert into multivarblock_zlibtab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multivarblock_zlibtab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
insert into multivarblock_zlibtab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
DROP TABLE IF EXISTS multi_segfile_tab;
CREATE TABLE multi_segfile_tab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) DISTRIBUTED BY (c_custkey);
insert into multi_segfile_tab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multi_segfile_tab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
update multi_segfile_tab set c_name = 'bcx' where c_custkey = 2;
vacuum multi_segfile_tab;
insert into multi_segfile_tab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
DROP TABLE IF EXISTS multi_segfile_bitab;
CREATE TABLE multi_segfile_bitab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) DISTRIBUTED BY (c_custkey);
CREATE INDEX multi_segfile_btree_idx ON multi_segfile_bitab USING btree (c_custkey);
insert into multi_segfile_bitab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multi_segfile_bitab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
update multi_segfile_bitab set c_name = 'bcx' where c_custkey = 2;
vacuum multi_segfile_bitab;
insert into multi_segfile_bitab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
DROP TABLE IF EXISTS multi_segfile_zlibtab;
CREATE TABLE multi_segfile_zlibtab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=9) DISTRIBUTED BY (c_custkey);
insert into multi_segfile_zlibtab values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multi_segfile_zlibtab values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
update multi_segfile_zlibtab set c_name = 'bcx' where c_custkey = 2;
vacuum multi_segfile_zlibtab;
insert into multi_segfile_zlibtab values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
DROP TABLE IF EXISTS multi_segfile_parttab;
CREATE TABLE multi_segfile_parttab (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) DISTRIBUTED BY (c_custkey)
partition by range(c_custkey) subpartition by range( c_rating)
subpartition template ( default subpartition subothers,start (0.0) end(1.9) every (2.0) )
(default partition others, partition p1 start(1) end(5000), partition p2 start(5000) end(10000), partition p3 start(10000) end(15000));
insert into multi_segfile_parttab values( 1, 'aa','this is a looong text' , 4.5, '12121212',1000.34,'2015/10/10',now());
insert into multi_segfile_parttab values( 2, 'ab','this is also a looong text' , 7.5, '3456789',3000.45,'2014/08/10',now());
update multi_segfile_parttab set c_name = 'bcx' where c_custkey = 2;
vacuum multi_segfile_parttab;
insert into multi_segfile_parttab values( 3, 'ac','this too is a looong text' , 1.5, '878787',4000.25,'2014/08/10',now());
DROP TABLE IF EXISTS multi_segfile_toast;
CREATE TABLE multi_segfile_toast (
c_custkey integer,
c_name character varying(25),
c_comment text,
c_rating float,
c_phone character(15),
c_acctbal numeric(15,2),
c_date date,
c_timestamp timestamp
)
WITH (checksum=true, appendonly=true, orientation=column, compresstype=zlib, compresslevel=1) DISTRIBUTED BY (c_custkey);
insert into multi_segfile_toast values( 1, 'aa','this is a looong text' , 3.5, '12121212',1000.34,'2015/10/10',now());
insert into multi_segfile_toast values( 2, 'ab','this is also a looong text' , 4.5, '3456789',3000.45,'2014/08/10',now());
update multi_segfile_toast set c_name = 'bcx' where c_custkey = 2;
vacuum multi_segfile_toast;
insert into multi_segfile_toast values( 3, 'ac','this too is a looong text' , 1.5, '878787',500.54,'2014/04/04',now());
--
-- @description AOCO multi_segfile table : add column with default value NULL
alter table multi_segfile_tab ADD COLUMN added_col3 character varying(35) default NULL;
select count(*) as added_col3 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col3';
added_col3
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : add column with default value non NULL
alter table multi_segfile_tab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL then add index on new column
alter table multi_segfile_tab ADD COLUMN added_col50 TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ;
select count(*) as added_col50 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col50';
added_col50
-------------
1
(1 row)
insert into multi_segfile_tab (c_custkey, c_name, c_comment, c_rating, c_phone, c_acctbal,c_date, c_timestamp)
values( 500, 'acz','yet another looong text' , 11.5, '778777',550.54,'2014/05/04',now());
create index multi_segfile_tab_idx2 on multi_segfile_tab(added_col50);
--
-- @description AOCO multi_segfile table : add column with default value NULL
alter table multi_segfile_bitab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : add column with default value non NULL
alter table multi_segfile_bitab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_bitab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multi_segfile_bitab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multi_segfile_bitab;
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_bitab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multi_segfile_bitab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_bitab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multi_segfile_bitab;
--
-- @description AOCO multi_segfile table : drop column with default value NULL
alter table multi_segfile_tab ADD COLUMN added_col33 character varying(35) default NULL;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col33';
added_col33
-------------
1
(1 row)
alter table multi_segfile_tab DROP COLUMN added_col33;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col33';
added_col33
-------------
0
(1 row)
VACUUM multi_segfile_tab;
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_tab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multi_segfile_tab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_tab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multi_segfile_tab;
--
-- @description AOCO multi_segfile table : add column with default value NULL
alter table multi_segfile_parttab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : add column with default value non NULL
alter table multi_segfile_parttab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : drop column with default value NULL
alter table multi_segfile_parttab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multi_segfile_parttab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multi_segfile_parttab;
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_parttab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multi_segfile_parttab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_parttab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multi_segfile_parttab;
--
-- @description AOCO multi_segfile table : add column toast with default value NULL
alter table multi_segfile_toast ADD COLUMN added_col3 bytea default NULL;
select count(*) as added_col3 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col3';
added_col3
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : add column with default value non NULL
alter table multi_segfile_toast ADD COLUMN added_col4 bytea default ("decode"(repeat('1234567890',10000),'escape'));
select count(*) as added_col4 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col4';
added_col4
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : drop column with default value NULL
alter table multi_segfile_toast ADD COLUMN added_col33 bytea default NULL;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col33';
added_col33
-------------
1
(1 row)
alter table multi_segfile_toast DROP COLUMN added_col33;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col33';
added_col33
-------------
0
(1 row)
VACUUM multi_segfile_toast;
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_toast ADD COLUMN added_col44 bytea default ("decode"(repeat('1234567890',10000),'escape'));
select count(*) as added_col44 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col44';
added_col44
-------------
1
(1 row)
alter table multi_segfile_toast DROP COLUMN added_col44;
select count(*) as added_col44 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_toast' and attname='added_col44';
added_col44
-------------
0
(1 row)
VACUUM multi_segfile_toast;
--
-- @description AOCO multi_segfile table : add column with default value NULL
alter table multi_segfile_zlibtab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : add column with default value non NULL
alter table multi_segfile_zlibtab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multi_segfile table : drop column with default value NULL
alter table multi_segfile_zlibtab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multi_segfile_zlibtab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multi_segfile_zlibtab;
--
-- @description AOCO multi_segfile table : drop column with default value non NULL
alter table multi_segfile_zlibtab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multi_segfile_zlibtab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multi_segfile_zlibtab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multi_segfile_zlibtab;
--
-- @description AOCO multivarblock table : add column with default value NULL
alter table multivarblock_tab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL
alter table multivarblock_tab ADD COLUMN added_col5 TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ;
select count(*) as added_col5 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col5';
added_col5
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with constraint and default value non NULL
-- Negative test
alter table multivarblock_tab add column added_col66 int CONSTRAINT multivarblock_tab_check1 CHECK (added_col66 < 10) default 30;
ERROR: check constraint "multivarblock_tab_check1" of relation "multivarblock_tab" is violated by some row (seg0 127.0.1.1:7002 pid=1938609)
select count(*) as added_col66 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col66';
added_col66
-------------
0
(1 row)
-- Positive test
alter table multivarblock_tab add column added_col66 int CONSTRAINT multivarblock_tab_check1 CHECK (added_col66 < 10) default 5;
select count(*) as added_col66 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col66';
added_col66
-------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL then add index on new column
alter table multivarblock_tab ADD COLUMN added_col50 TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ;
select count(*) as added_col50 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col50';
added_col50
-------------
1
(1 row)
insert into multivarblock_tab (c_custkey, c_name, c_comment, c_rating, c_phone, c_acctbal,c_date, c_timestamp)
values( 500, 'acz','yet another looong text' , 11.5, '778777',550.54,'2014/05/04',now());
create index multivarblock_tab_idx2 on multivarblock_tab(added_col50);
--
-- @description AOCO multivarblock table : add column with default value NULL
alter table multivarblock_bitab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL
alter table multivarblock_bitab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multivarblock table : drop column with default value NULL
alter table multivarblock_bitab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multivarblock_bitab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multivarblock_bitab;
--
-- @description AOCO multivarblock table : drop column with default value non NULL
alter table multivarblock_bitab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multivarblock_bitab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_bitab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multivarblock_bitab;
--
-- @description AOCO multivarblock table : drop column with default value NULL
alter table multivarblock_tab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multivarblock_tab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multivarblock_tab;
--
-- @description AOCO multivarblock table : drop column with default value non NULL
alter table multivarblock_tab ADD COLUMN added_col55 TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ;
select count(*) as added_col55 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col55';
added_col55
-------------
1
(1 row)
alter table multivarblock_tab DROP COLUMN added_col55;
select count(*) as added_col55 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_tab' and attname='added_col55';
added_col55
-------------
0
(1 row)
VACUUM multivarblock_tab;
--
-- @description AOCO multivarblock table : add column with default value NULL
alter table multivarblock_parttab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL
alter table multivarblock_parttab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multivarblock table : drop column with default value NULL
alter table multivarblock_parttab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multivarblock_parttab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multivarblock_parttab;
--
-- @description AOCO multivarblock partition table : drop column with default value non NULL
alter table multivarblock_parttab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multivarblock_parttab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_parttab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multivarblock_parttab;
--
-- @description AOCO multivarblock table : add column toast with default value NULL
alter table multivarblock_toast ADD COLUMN added_col3 bytea default NULL;
select count(*) as added_col3 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col3';
added_col3
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL
alter table multivarblock_toast ADD COLUMN added_col4 bytea default ("decode"(repeat('1234567890',10000),'escape'));
select count(*) as added_col4 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col4';
added_col4
------------
1
(1 row)
--
-- @description AOCO multivarblock table : drop column with default value NULL
alter table multivarblock_toast ADD COLUMN added_col33 bytea default NULL;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col33';
added_col33
-------------
1
(1 row)
alter table multivarblock_toast DROP COLUMN added_col33;
select count(*) as added_col33 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col33';
added_col33
-------------
0
(1 row)
VACUUM multivarblock_toast;
--
-- @description AOCO multivarblock table : drop column with default value non NULL
alter table multivarblock_toast ADD COLUMN added_col44 bytea default ("decode"(repeat('1234567890',10000),'escape'));
select count(*) as added_col44 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col44';
added_col44
-------------
1
(1 row)
alter table multivarblock_toast DROP COLUMN added_col44;
select count(*) as added_col44 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_toast' and attname='added_col44';
added_col44
-------------
0
(1 row)
VACUUM multivarblock_toast;
--
-- @description AOCO multivarblock table : add column with default value NULL
alter table multivarblock_zlibtab ADD COLUMN added_col2 character varying(35) default NULL;
select count(*) as added_col2 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col2';
added_col2
------------
1
(1 row)
--
-- @description AOCO multivarblock table : add column with default value non NULL
alter table multivarblock_zlibtab ADD COLUMN added_col1 character varying(35) default 'this is default value of non null';
select count(*) as added_col1 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col1';
added_col1
------------
1
(1 row)
--
-- @description AOCO multivarblock table : drop column with default value NULL
alter table multivarblock_zlibtab ADD COLUMN added_col22 character varying(35) default NULL;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col22';
added_col22
-------------
1
(1 row)
alter table multivarblock_zlibtab DROP COLUMN added_col22;
select count(*) as added_col22 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col22';
added_col22
-------------
0
(1 row)
VACUUM multivarblock_zlibtab;
--
-- @description AOCO multivarblock zlib compressed table : drop column with default value non NULL
alter table multivarblock_zlibtab ADD COLUMN added_col11 character varying(35) default 'this is default value of non null';
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col11';
added_col11
-------------
1
(1 row)
alter table multivarblock_zlibtab DROP COLUMN added_col11;
select count(*) as added_col11 from pg_attribute pa, pg_class pc where pa.attrelid = pc.oid and pc.relname='multivarblock_zlibtab' and attname='added_col11';
added_col11
-------------
0
(1 row)
VACUUM multivarblock_zlibtab;
--
-- Non-bulk dense content header with RLE compression
-- This will insert more rows than a small content header can accommodate in the same insert statement
drop table if exists nonbulk_rle_tab;
NOTICE: table "nonbulk_rle_tab" does not exist, skipping
create table nonbulk_rle_tab (a int) with (appendonly=true, orientation=column, compresstype='rle_type', checksum=true);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
insert into nonbulk_rle_tab select i/50 from generate_series(1, 1000000)i;
alter table nonbulk_rle_tab add column b int default round(random()*100);
insert into nonbulk_rle_tab values (-1,-5);
ANALYZE nonbulk_rle_tab; -- To avoid NOTICE about missing stats with ORCA.
update nonbulk_rle_tab set b = b + 3 where a = -1;
CREATE FUNCTION descendants_of(rel regclass) RETURNS TABLE(descendant regclass)
SET gp_recursive_cte=ON
LANGUAGE SQL STABLE AS $fn$
WITH RECURSIVE w AS (
SELECT rel AS descendant
UNION ALL
SELECT inhrelid
FROM pg_inherits JOIN w ON inhparent = descendant
)
SELECT * FROM w;
$fn$;
-- Scenario 1: Parent is AOCO, 1 child is AO, 1 child is heap. AO children require full table rewrite
CREATE TABLE rewrite_optimization_aoco_parent(a int, b int, c int)
WITH (APPENDONLY = true, ORIENTATION = column)
DISTRIBUTED BY (a)
PARTITION BY RANGE (b)
(START (0) END (1) EVERY (1) WITH (APPENDONLY = true),
START (1) END (2) EVERY (1) WITH (APPENDONLY = false));
SELECT $$
SELECT -1 AS segno, oid::regclass AS rel, relfilenode, (select amname from pg_am where pg_am.oid = relam)
FROM pg_class c
WHERE c.oid IN (SELECT descendant FROM descendants_of(:'ROOT_PARTITION_UNDER_TEST'))
UNION ALL
SELECT gp_segment_id, oid::regclass, relfilenode, (select amname from pg_am where pg_am.oid = relam)
FROM gp_dist_random('pg_class') c
WHERE c.oid IN (SELECT descendant FROM descendants_of(:'ROOT_PARTITION_UNDER_TEST'))
$$ AS qry \gset
SELECT $$
SELECT t.segno,
t.rel,
t.amname,
CASE
WHEN table_relfilenode.segno IS NULL THEN 'full table rewritten'
ELSE 'ADD COLUMN optimized for table' END AS aoco_add_col_optimized
FROM (:qry) t
LEFT JOIN table_relfilenode USING (segno, rel, relfilenode)
WHERE t.segno IN (-1, 0)
ORDER BY 1, 2;
$$ AS chk_co_opt_qry \gset
\set ROOT_PARTITION_UNDER_TEST rewrite_optimization_aoco_parent
CREATE MATERIALIZED VIEW table_relfilenode (segno, rel, relfilenode)
AS
:qry
;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'segno' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO rewrite_optimization_aoco_parent SELECT i, i % 2, i FROM generate_series(1,10)i;
ALTER TABLE rewrite_optimization_aoco_parent ADD COLUMN new_col int DEFAULT 1;
SELECT * FROM rewrite_optimization_aoco_parent;
a | b | c | new_col
----+---+----+---------
1 | 1 | 1 | 1
6 | 0 | 6 | 1
10 | 0 | 10 | 1
5 | 1 | 5 | 1
9 | 1 | 9 | 1
2 | 0 | 2 | 1
4 | 0 | 4 | 1
8 | 0 | 8 | 1
3 | 1 | 3 | 1
7 | 1 | 7 | 1
(10 rows)
:chk_co_opt_qry;
segno | rel | amname | aoco_add_col_optimized
-------+------------------------------------------+-----------+--------------------------------
-1 | rewrite_optimization_aoco_parent | ao_column | ADD COLUMN optimized for table
-1 | rewrite_optimization_aoco_parent_1_prt_1 | ao_row | full table rewritten
-1 | rewrite_optimization_aoco_parent_1_prt_2 | heap | ADD COLUMN optimized for table
0 | rewrite_optimization_aoco_parent | ao_column | ADD COLUMN optimized for table
0 | rewrite_optimization_aoco_parent_1_prt_1 | ao_row | full table rewritten
0 | rewrite_optimization_aoco_parent_1_prt_2 | heap | ADD COLUMN optimized for table
(6 rows)
-- ADD COLUMN for AOCO partition children should not trigger full table rewrite
-- Scenario 2: Parent is heap, 1 child is AO, 1 child is AOCO. AO child requires full table rewrite. AOCO child does not.
CREATE TABLE rewrite_optimization_heap_parent(a int, b int, c int) DISTRIBUTED BY (a)
PARTITION BY RANGE (b)
(START (0) END (1) EVERY (1) WITH (APPENDONLY = true),
START (1) END (2) EVERY (1) WITH (APPENDONLY = true, ORIENTATION = column));
\set ROOT_PARTITION_UNDER_TEST rewrite_optimization_heap_parent
DROP MATERIALIZED VIEW table_relfilenode;
CREATE MATERIALIZED VIEW table_relfilenode (segno, rel, relfilenode)
AS
:qry
;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'segno' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO rewrite_optimization_heap_parent SELECT i, i % 2, i FROM generate_series(1,10)i;
ALTER TABLE rewrite_optimization_heap_parent ADD COLUMN new_col int DEFAULT 1;
SELECT * FROM rewrite_optimization_heap_parent;
a | b | c | new_col
----+---+----+---------
6 | 0 | 6 | 1
10 | 0 | 10 | 1
5 | 1 | 5 | 1
9 | 1 | 9 | 1
2 | 0 | 2 | 1
4 | 0 | 4 | 1
8 | 0 | 8 | 1
3 | 1 | 3 | 1
7 | 1 | 7 | 1
1 | 1 | 1 | 1
(10 rows)
:chk_co_opt_qry;
segno | rel | amname | aoco_add_col_optimized
-------+------------------------------------------+-----------+--------------------------------
-1 | rewrite_optimization_heap_parent | | ADD COLUMN optimized for table
-1 | rewrite_optimization_heap_parent_1_prt_1 | ao_row | full table rewritten
-1 | rewrite_optimization_heap_parent_1_prt_2 | ao_column | ADD COLUMN optimized for table
0 | rewrite_optimization_heap_parent | | ADD COLUMN optimized for table
0 | rewrite_optimization_heap_parent_1_prt_1 | ao_row | full table rewritten
0 | rewrite_optimization_heap_parent_1_prt_2 | ao_column | ADD COLUMN optimized for table
(6 rows)
REFRESH MATERIALIZED VIEW table_relfilenode;
ALTER TABLE rewrite_optimization_heap_parent ADD COLUMN new_col2 int DEFAULT 1, ALTER COLUMN c TYPE bigint;
SELECT * FROM rewrite_optimization_heap_parent;
a | b | c | new_col | new_col2
----+---+----+---------+----------
1 | 1 | 1 | 1 | 1
6 | 0 | 6 | 1 | 1
10 | 0 | 10 | 1 | 1
5 | 1 | 5 | 1 | 1
9 | 1 | 9 | 1 | 1
2 | 0 | 2 | 1 | 1
4 | 0 | 4 | 1 | 1
8 | 0 | 8 | 1 | 1
3 | 1 | 3 | 1 | 1
7 | 1 | 7 | 1 | 1
(10 rows)
:chk_co_opt_qry;
segno | rel | amname | aoco_add_col_optimized
-------+------------------------------------------+-----------+--------------------------------
-1 | rewrite_optimization_heap_parent | | ADD COLUMN optimized for table
-1 | rewrite_optimization_heap_parent_1_prt_1 | ao_row | full table rewritten
-1 | rewrite_optimization_heap_parent_1_prt_2 | ao_column | full table rewritten
0 | rewrite_optimization_heap_parent | | ADD COLUMN optimized for table
0 | rewrite_optimization_heap_parent_1_prt_1 | ao_row | full table rewritten
0 | rewrite_optimization_heap_parent_1_prt_2 | ao_column | full table rewritten
(6 rows)
-- Parent is heap, child is heap, grandchild is AOCO.
CREATE TABLE subpartition_aoco_leaf(a int, b int, c int)
DISTRIBUTED BY (a)
PARTITION BY RANGE(b) SUBPARTITION BY RANGE(c)
(PARTITION intermediate START (0) END (2)
(SUBPARTITION leaf START (0) END(2) WITH (APPENDONLY = true, ORIENTATION = column))
);
INSERT INTO subpartition_aoco_leaf SELECT i, i % 2, i % 2 FROM generate_series(1,10)i;
\set ROOT_PARTITION_UNDER_TEST subpartition_aoco_leaf
DROP MATERIALIZED VIEW table_relfilenode;
CREATE MATERIALIZED VIEW table_relfilenode (segno, rel, relfilenode)
AS
:qry
;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'segno' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
-- Scenario 1: ADD COLUMN for AOCO subpartitioned table should not trigger full
-- table rewrite. AOCO leaf only writes new column
ALTER TABLE subpartition_aoco_leaf ADD COLUMN new_col int DEFAULT 1;
SELECT * FROM subpartition_aoco_leaf;
a | b | c | new_col
----+---+---+---------
1 | 1 | 1 | 1
5 | 1 | 1 | 1
6 | 0 | 0 | 1
9 | 1 | 1 | 1
10 | 0 | 0 | 1
2 | 0 | 0 | 1
3 | 1 | 1 | 1
4 | 0 | 0 | 1
7 | 1 | 1 | 1
8 | 0 | 0 | 1
(10 rows)
:chk_co_opt_qry;
segno | rel | amname | aoco_add_col_optimized
-------+------------------------------------------------------+-----------+--------------------------------
-1 | subpartition_aoco_leaf | | ADD COLUMN optimized for table
-1 | subpartition_aoco_leaf_1_prt_intermediate | heap | ADD COLUMN optimized for table
-1 | subpartition_aoco_leaf_1_prt_intermediate_2_prt_leaf | ao_column | ADD COLUMN optimized for table
0 | subpartition_aoco_leaf | | ADD COLUMN optimized for table
0 | subpartition_aoco_leaf_1_prt_intermediate | heap | ADD COLUMN optimized for table
0 | subpartition_aoco_leaf_1_prt_intermediate_2_prt_leaf | ao_column | ADD COLUMN optimized for table
(6 rows)
REFRESH MATERIALIZED VIEW table_relfilenode;
-- Scenario 2: mixing ADD COLUMN with ALTER COLUMN TYPE should trigger full on aoco
-- table rewrite for every level
ALTER TABLE subpartition_aoco_leaf ADD COLUMN new_col2 int DEFAULT 1, ALTER COLUMN new_col TYPE bigint;
SELECT * FROM subpartition_aoco_leaf;
a | b | c | new_col | new_col2
----+---+---+---------+----------
1 | 1 | 1 | 1 | 1
2 | 0 | 0 | 1 | 1
3 | 1 | 1 | 1 | 1
4 | 0 | 0 | 1 | 1
7 | 1 | 1 | 1 | 1
8 | 0 | 0 | 1 | 1
5 | 1 | 1 | 1 | 1
6 | 0 | 0 | 1 | 1
9 | 1 | 1 | 1 | 1
10 | 0 | 0 | 1 | 1
(10 rows)
:chk_co_opt_qry;
segno | rel | amname | aoco_add_col_optimized
-------+------------------------------------------------------+-----------+--------------------------------
-1 | subpartition_aoco_leaf | | ADD COLUMN optimized for table
-1 | subpartition_aoco_leaf_1_prt_intermediate | heap | ADD COLUMN optimized for table
-1 | subpartition_aoco_leaf_1_prt_intermediate_2_prt_leaf | ao_column | full table rewritten
0 | subpartition_aoco_leaf | | ADD COLUMN optimized for table
0 | subpartition_aoco_leaf_1_prt_intermediate | heap | ADD COLUMN optimized for table
0 | subpartition_aoco_leaf_1_prt_intermediate_2_prt_leaf | ao_column | full table rewritten
(6 rows)
-- Check if add column doesn't rewrite the table
CREATE TABLE testaddcol(i int) WITH (appendonly=true, orientation=column);
INSERT INTO testaddcol SELECT generate_series(1, 5);
CREATE TEMP TABLE relfilebeforetestaddcol AS
SELECT -1 segid, relname, relfilenode FROM pg_class WHERE relname LIKE 'testaddcol%'
UNION SELECT gp_segment_id segid, relname, relfilenode FROM gp_dist_random('pg_class')
WHERE relname LIKE 'testaddcol%' ORDER BY segid;
ALTER TABLE testaddcol ADD COLUMN j int DEFAULT 5;
CREATE TEMP TABLE relfileaftertestaddcol AS
SELECT -1 segid, relname, relfilenode FROM pg_class WHERE relname LIKE 'testaddcol%'
UNION SELECT gp_segment_id segid, relname, relfilenode FROM gp_dist_random('pg_class')
WHERE relname LIKE 'testaddcol%' ORDER BY segid;
-- table shouldn't be rewritten
SELECT count(*) FROM (SELECT * FROM relfilebeforetestaddcol UNION SELECT * FROM relfileaftertestaddcol)a;
count
-------
4
(1 row)
-- data is intact
SELECT * FROM testaddcol;
i | j
---+---
2 | 5
3 | 5
4 | 5
5 | 5
1 | 5
(5 rows)