| -- |
| -- This test suite tests COPY code that is unique to greenplum db. |
| -- |
| |
| -- ###################################################### |
| -- different distribution columns and distribution types |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_hash1(a text, b text, c text) distributed by (b); |
| CREATE TABLE copy_regression_hash2(a text, b text, c text) distributed by (a,c); |
| CREATE TABLE copy_regression_hash3(a varchar, b int, c int, d text) distributed by (a,c,d); |
| CREATE TABLE copy_regression_hash4(a int[], b text) distributed by (a); |
| CREATE TABLE copy_regression_hash5(a text[][]) distributed by (a); |
| CREATE TABLE copy_regression_hash6(a int[], b text[]) distributed by (a,b); |
| CREATE TABLE copy_regression_hash7(a text,b text) distributed randomly; |
| |
| -- single key, not first |
| |
| COPY copy_regression_hash1 from stdin; |
| a data b data c data |
| \. |
| COPY copy_regression_hash1(b,c,a) from stdin; |
| b data c data a data |
| \. |
| SELECT * FROM copy_regression_hash1; |
| |
| -- two keys |
| |
| COPY copy_regression_hash2 from stdin; |
| a data b data c data |
| \. |
| COPY copy_regression_hash2(b,c,a) from stdin; |
| b data c data a data |
| \. |
| SELECT * FROM copy_regression_hash2; |
| |
| -- three keys |
| |
| COPY copy_regression_hash3 from stdin; |
| a data 2 3 d data |
| \. |
| COPY copy_regression_hash3(c,d,b,a) from stdin; |
| 3 d data 2 a data |
| \. |
| COPY copy_regression_hash3(a,c) from stdin; |
| a data 3 |
| \. |
| COPY copy_regression_hash3(d) from stdin; |
| d data |
| \. |
| SELECT * FROM copy_regression_hash3; |
| |
| -- hash on int array |
| |
| COPY copy_regression_hash4 from stdin; |
| {1,2,3,4,5} hashed on an integer array |
| {10,20,30,40,50} hashed on an integer array |
| \. |
| SELECT * FROM copy_regression_hash4 ORDER BY a; |
| |
| -- hash on 2 dim varchar array |
| |
| COPY copy_regression_hash5 from stdin; |
| {{hashing,on},{two dimentional,text array}} |
| \. |
| SELECT * FROM copy_regression_hash5 ORDER BY a; |
| |
| -- hash on int array and varchar array |
| |
| COPY copy_regression_hash6 from stdin; |
| {1,2,3,4,5} {hashing,on,intarray,and,varchararray} |
| \. |
| SELECT * FROM copy_regression_hash6 ORDER BY a; |
| |
| -- hash randomly |
| |
| COPY copy_regression_hash7 from stdin; |
| a data b data |
| a data b data |
| \. |
| SELECT * FROM copy_regression_hash7; |
| |
| DROP TABLE copy_regression_hash1; |
| DROP TABLE copy_regression_hash2; |
| DROP TABLE copy_regression_hash3; |
| DROP TABLE copy_regression_hash4; |
| DROP TABLE copy_regression_hash5; |
| DROP TABLE copy_regression_hash6; |
| DROP TABLE copy_regression_hash7; |
| |
| -- ###################################################### |
| -- default values and default functions |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_default1(a text not null default 'a default data', b text not null default 'b default data') distributed by(a); |
| CREATE TABLE copy_regression_default2(a text, b serial, c text) distributed by(a); |
| CREATE TABLE copy_regression_default3(a serial, b text, c text) distributed by(a); |
| |
| -- constant defaults on key and non key attributes |
| |
| COPY copy_regression_default1(a) from stdin; |
| a data |
| \. |
| COPY copy_regression_default1(b) from stdin; |
| b data |
| \. |
| SELECT * FROM copy_regression_default1; |
| |
| -- non constant default on non hash key in both text and csv |
| |
| COPY copy_regression_default2(a,c) from stdin; |
| a data c data |
| a data c data |
| a data c data |
| \. |
| COPY copy_regression_default2(a,c) from stdin csv; |
| a data,c data |
| a data,c data |
| a data,c data |
| \. |
| SELECT * FROM copy_regression_default2; |
| |
| -- non constant default on hash key in both text and csv |
| |
| COPY copy_regression_default3(b,c) from stdin; |
| b data c data |
| b data c data |
| b data c data |
| \. |
| COPY copy_regression_default3(b,c) from stdin csv; |
| b data,c data |
| b data,c data |
| b data,c data |
| \. |
| SELECT * FROM copy_regression_default2; |
| |
| DROP TABLE copy_regression_default1; |
| DROP TABLE copy_regression_default2; |
| DROP TABLE copy_regression_default3; |
| |
| -- ###################################################### |
| -- COPY OUT |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_out1(a text, b varchar, c int[], d bool) distributed by(a); |
| |
| -- populating table with data for copy out tests. NOTE: since we can't control the order |
| -- of rows COPY OUT produces from the segdb, we must have only one row for each test table. |
| |
| COPY copy_regression_out1 from stdin null 'nullval'; |
| a copyout data line 2 nullval {2,2,2} true |
| \. |
| |
| -- copy out default parameters text format.. |
| COPY copy_regression_out1 to stdout; |
| |
| -- copy out '|' delimiter 'mynull' null.. |
| COPY copy_regression_out1 to stdout with delimiter '|' null 'mynull'; |
| |
| -- copy out '|' delimiter "i'm null" null.. |
| COPY copy_regression_out1 to stdout with delimiter '|' null 'i''m null'; |
| |
| -- copy out default parameters csv format.. |
| COPY copy_regression_out1 to stdout with csv; |
| |
| -- copy out default parameters csv format with header.. |
| COPY copy_regression_out1 to stdout with csv header; |
| |
| -- copy out partial and mixed column list (c,a,b).. |
| COPY copy_regression_out1(c,a,b) to stdout; |
| |
| -- copy out csv default quotes and escapes and special cases.. |
| COPY copy_regression_out1 to stdout with csv quote ''''; -- escape should be the same as quote |
| COPY copy_regression_out1 to stdout with csv escape ''''; |
| COPY copy_regression_out1 to stdout with csv quote '''' escape E'\\'; -- make sure E'' is accepted |
| |
| DROP TABLE copy_regression_out1; |
| |
| |
| -- ###################################################### |
| -- Zero column table |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_nocol(); |
| |
| -- copy in and out of zero column table.. |
| COPY copy_regression_nocol from stdin; |
| \. |
| COPY copy_regression_nocol from stdin; |
| we should get an "extra data" error here |
| \. |
| COPY copy_regression_nocol from stdin with csv; |
| \. |
| COPY copy_regression_nocol from stdin with csv; -- should fail |
| we should get an "extra data" error here |
| \. |
| COPY copy_regression_nocol to stdout; |
| COPY copy_regression_nocol to stdout with csv; |
| |
| DROP TABLE copy_regression_nocol; |
| |
| |
| -- ###################################################### |
| -- Various text format escape and default format tests |
| -- ###################################################### |
| |
| -- for text format |
| CREATE TABLE copy_regression_text1(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| CREATE TABLE copy_regression_text2(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| CREATE TABLE copy_regression_text3(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| |
| -- column order tests |
| |
| COPY copy_regression_text1 from stdin; |
| a text data b text data c text data d text data e text data |
| \. |
| COPY copy_regression_text1(a,b,c,d,e) from stdin; |
| a text data b text data c text data d text data e text data |
| \. |
| COPY copy_regression_text1(e,d,c,b,a) from stdin; |
| e text data d text data c text data b text data a text data |
| \. |
| COPY copy_regression_text1(c,a,b,e,d) from stdin; |
| c text data a text data b text data e text data d text data |
| \. |
| COPY copy_regression_text1(a,c) from stdin; |
| a text data c text data |
| \. |
| SELECT * FROM copy_regression_text1; |
| |
| -- null print tests |
| |
| COPY copy_regression_text2 from stdin; |
| a text data \N c text data \N e text data |
| \. |
| COPY copy_regression_text2 from stdin with null 'nullvalue'; |
| a text data nullvalue c text data nullvalue nullvalue |
| \. |
| COPY copy_regression_text2 from stdin with delimiter '|' null ''; |
| a text data||c text data||e text data |
| |b text data|c text data||e text data |
| \. |
| COPY copy_regression_text2 from stdin with delimiter '|' null 'i''m null'; |
| a text data|b text data|i'm null|i'm null|e text data |
| \. |
| SELECT * FROM copy_regression_text2; |
| |
| -- escape tests |
| |
| COPY copy_regression_text3 from stdin with delimiter '|' escape '#'; |
| the at sign: #100 |1|c text data|d text data|e text data |
| an embedded delimiter #| character |2|c text data|d text data|e text data |
| a single backslash \ in col a|3|c text data|d text data|e text data |
| \. |
| COPY copy_regression_text3 from stdin with delimiter '|' escape 'off'; |
| a single backslash \ in col a|4|c text data|d text data|e text data |
| c:\\file\data\neew\path|5|c text data|d text data|e text data |
| \. |
| COPY copy_regression_text3 from stdin with delimiter '|'; |
| the at sign: \100|6|c text data|d text data|e text data |
| a single backslash \\ in col a|8|c text data|d text data|e text data |
| \. |
| COPY copy_regression_text3 from stdin with delimiter '|'; |
| an embedded linefeed \ |
| and another one\ |
| in column a|7|c text data|d text data|e text data |
| \. |
| COPY copy_regression_text3 from stdin with delimiter '|'; |
| an embedded linefeed sequence\nin column a|7|c text data|d text data|e text data |
| \. |
| |
| SELECT * FROM copy_regression_text3 ORDER BY b,a; |
| |
| DROP TABLE copy_regression_text1; |
| DROP TABLE copy_regression_text2; |
| DROP TABLE copy_regression_text3; |
| |
| |
| |
| -- ###################################################### |
| -- Various text format escape and default format tests |
| -- ###################################################### |
| |
| -- for csv format |
| CREATE TABLE copy_regression_csv1(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| CREATE TABLE copy_regression_csv2(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| CREATE TABLE copy_regression_csv3(a varchar ,b varchar, c text, d text, e text) distributed by(a); |
| |
| -- column order tests |
| |
| COPY copy_regression_csv1 from stdin with csv; |
| a csv data,b csv data,c csv data,d csv data,e csv data |
| \. |
| COPY copy_regression_csv1(a,b,c,d,e) from stdin with csv; |
| a csv data,b csv data,c csv data,d csv data,e csv data |
| \. |
| COPY copy_regression_csv1(e,d,c,b,a) from stdin with csv; |
| e csv data,d csv data,c csv data,b csv data,a csv data |
| \. |
| COPY copy_regression_csv1(c,a,b,e,d) from stdin with csv; |
| c csv data,a csv data,b csv data,e csv data,d csv data |
| \. |
| COPY copy_regression_csv1(a,c) from stdin with csv; |
| a csv data,c csv data |
| \. |
| SELECT * FROM copy_regression_csv1; |
| |
| -- null print tests |
| |
| COPY copy_regression_csv2 from stdin with null E'\\N' csv ; |
| a csv data,\N,c csv data,\N,e csv data |
| \. |
| COPY copy_regression_csv2 from stdin with null 'nullvalue' csv; |
| a csv data,nullvalue,c csv data,nullvalue,nullvalue |
| \. |
| COPY copy_regression_csv2 from stdin with delimiter '|' null '' csv; |
| a csv data||c csv data||e csv data |
| |b csv data|c csv data||e csv data |
| \. |
| SELECT * FROM copy_regression_csv2; |
| |
| -- escape tests |
| |
| COPY copy_regression_csv3 from stdin with csv escape E'\\'; |
| "an embedded delimiter (comma), is printed",01,c csv data,d csv data,e csv data |
| "an embedded quote (doubleq)\" is printed",02,c csv data,d csv data,e csv data |
| "an embedded escape \\ is printed",03,c csv data,d csv data,e csv data |
| "an embedded line feed |
| is printed",04,c csv data,d csv data,e csv data |
| \. |
| COPY copy_regression_csv3 from stdin with delimiter E'\t' csv; --default quote and escape - " |
| "an embedded delimiter (tab) is printed" 05 c csv data d csv data e csv data |
| "an embedded quote or escape (doubleq)"" is printed" 06 c csv data d csv data e csv data |
| "an embedded line feed |
| is printed" 07 c csv data d csv data e csv data |
| \. |
| COPY copy_regression_csv3 from stdin with delimiter '|' csv quote ';' escape '*'; |
| ;an embedded delimiter (pipe)| is printed;|08|c csv data|d csv data|e csv data |
| ;an embedded quote (semicolon)*; is printed;|09|c csv data|d csv data|e csv data |
| ;an embedded escape (asterisk)** is printed;|10|c csv data|d csv data|e csv data |
| ;an embedded line feed |
| is printed;|11|c csv data|d csv data|e csv data |
| \. |
| |
| -- check defaults |
| COPY copy_regression_csv3 from stdin with csv quote ''''; -- escape should be the same as quote |
| 'an embedded single quote '' here',12,c csv data,d csv data,e csv data |
| \. |
| COPY copy_regression_csv3 from stdin with csv escape ''''; |
| "an embedded single quote '' here",13,c csv data,d csv data,e csv data |
| \. |
| COPY copy_regression_csv3 from stdin with csv quote '''' escape E'\\'; -- make sure E'' is accepted |
| 'an embedded backslash \\ here',14,c csv data,d csv data,e csv data |
| \. |
| SELECT * FROM copy_regression_csv3 ORDER BY b; |
| |
| DROP TABLE copy_regression_csv1; |
| DROP TABLE copy_regression_csv2; |
| DROP TABLE copy_regression_csv3; |
| |
| -- ###################################################### |
| -- FILL MISSING FIELDS |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_fill1(a int, b int, c text) distributed by(a); |
| CREATE TABLE copy_regression_fill2(a int, b int, c text) distributed by(c); |
| |
| -- text |
| COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; |
| 1|1|one |
| 2|2 |
| 3 |
| \. |
| COPY copy_regression_fill1(c,b) from stdin with delimiter '|' fill missing fields; |
| one|1 |
| two |
| three |
| \. |
| COPY copy_regression_fill2(a,c) from stdin with delimiter '|' fill missing fields; |
| 1|one |
| 2 |
| 3|three |
| \. |
| SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; |
| SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; |
| TRUNCATE copy_regression_fill1; |
| TRUNCATE copy_regression_fill2; |
| |
| -- csv |
| COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; |
| 1|1|one |
| 2|2 |
| 3 |
| \. |
| COPY copy_regression_fill1(c,b) from stdin with csv delimiter '|' fill missing fields; |
| one|1 |
| two |
| three |
| \. |
| COPY copy_regression_fill2(a,c) from stdin with csv delimiter '|' fill missing fields; |
| 1|one |
| 2 |
| 3|three |
| \. |
| SELECT * FROM copy_regression_fill1 ORDER BY a,b,c; |
| SELECT * FROM copy_regression_fill2 ORDER BY a,b,c; |
| |
| -- empty row should fail |
| COPY copy_regression_fill1 from stdin with delimiter '|' fill missing fields; |
| |
| \. |
| COPY copy_regression_fill2 from stdin with delimiter '|' fill missing fields; |
| |
| \. |
| COPY copy_regression_fill1 from stdin with csv delimiter '|' fill missing fields; |
| |
| \. |
| COPY copy_regression_fill2 from stdin with csv delimiter '|' fill missing fields; |
| |
| \. |
| DROP TABLE copy_regression_fill1; |
| DROP TABLE copy_regression_fill2; |
| |
| -- ###################################################### |
| -- FORCE NOT NULL |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_fnn(a text, b text, c text) distributed by(a); |
| |
| COPY copy_regression_fnn from stdin with csv; |
| one,,one |
| two,, |
| \. |
| SELECT * FROM copy_regression_fnn WHERE b is null order by a; |
| SELECT * FROM copy_regression_fnn WHERE c is null order by a; |
| TRUNCATE copy_regression_fnn; |
| |
| COPY copy_regression_fnn from stdin with csv force not null b; |
| one,,one |
| two,, |
| \. |
| SELECT * FROM copy_regression_fnn WHERE b is null order by a; |
| SELECT * FROM copy_regression_fnn WHERE c is null order by a; |
| TRUNCATE copy_regression_fnn; |
| |
| COPY copy_regression_fnn from stdin with csv force not null b,c; |
| one,,one |
| two,, |
| \. |
| SELECT * FROM copy_regression_fnn WHERE b is null order by a; |
| SELECT * FROM copy_regression_fnn WHERE c is null order by a; |
| TRUNCATE copy_regression_fnn; |
| |
| -- now combine with fill missing fields |
| COPY copy_regression_fnn from stdin with csv fill missing fields force not null b; |
| one,,one |
| two, |
| \. |
| SELECT * FROM copy_regression_fnn WHERE b is null order by a; |
| SELECT * FROM copy_regression_fnn WHERE c is null order by a; |
| |
| DROP TABLE copy_regression_fnn; |
| |
| -- ########################################################### |
| -- distributed data error consolidation + original row numbers |
| -- ########################################################### |
| |
| CREATE TABLE copy_regression_error1(a int, b int) distributed by(a); |
| |
| -- parse error on QE (extra column on line 6) |
| |
| COPY copy_regression_error1 from stdin; |
| 1 1 |
| 2 2 |
| 3 3 |
| 4 4 |
| 5 5 |
| 6 6 6 |
| 7 7 |
| \. |
| |
| -- parse error on QD (missing column on line 3) |
| COPY copy_regression_error1 from stdin; |
| 1 1 |
| 2 2 |
| 3 |
| 4 4 |
| \. |
| |
| -- convert error on QD (invalid type line 2) |
| |
| COPY copy_regression_error1 from stdin; |
| 1 1 |
| two 2 |
| 3 3 |
| \. |
| |
| -- convert error on QE (invalid type line 5) |
| COPY copy_regression_error1 from stdin; |
| 1 1 |
| 2 2 |
| 3 3 |
| 4 4 |
| 5 five |
| 6 6 |
| 7 7 |
| \. |
| |
| DROP TABLE copy_regression_error1; |
| |
| -- ###################################################### |
| -- NEWLINE |
| -- ###################################################### |
| |
| CREATE TABLE copy_regression_newline(a text, b text) distributed by(a); |
| |
| -- positive: text |
| COPY copy_regression_newline from stdin with delimiter '|' newline 'lf'; |
| 1|1 |
| 2|2 |
| \. |
| |
| -- positive: csv |
| COPY copy_regression_newline from stdin with delimiter '|' newline 'lf' csv; |
| 1|1 |
| 2|2 |
| \. |
| |
| -- negative: text |
| COPY copy_regression_newline from stdin with delimiter '|' newline 'cr'; |
| 1|1 |
| 2|2 |
| \. |
| |
| -- negative: csv |
| COPY copy_regression_newline from stdin with delimiter '|' newline 'cr' csv; |
| 1|1 |
| 2|2 |
| \. |
| |
| -- negative: invalid newline |
| COPY copy_regression_newline from stdin with delimiter '|' newline 'blah'; |
| -- negative: newline not yet supported for COPY TO |
| COPY copy_regression_newline to stdout with delimiter '|' newline 'blah'; |
| |
| DROP TABLE copy_regression_newline; |
| |
| -- Test that FORCE QUOTE option works with the fastpath for integers and |
| -- numerics |
| COPY ( |
| SELECT 123::integer as intcol, 456::numeric as numcol, 'foo' as textcol |
| ) TO stdout CSV FORCE QUOTE intcol, numcol, textcol; |
| |
| -- Do the same with a real table, to test that the option also works when |
| -- doing a "dispatched" COPY, i.e. when the COPY output is produced in |
| -- segments |
| CREATE TABLE force_quotes_tbl(intcol integer, numcol numeric, textcol text) DISTRIBUTED BY (intcol); |
| INSERT INTO force_quotes_tbl VALUES (123, 456, 'foo'); |
| |
| COPY force_quotes_tbl TO stdout CSV FORCE QUOTE intcol, numcol, textcol; |
| DROP TABLE force_quotes_tbl; |
| |
| -- Tests for error log |
| DROP TABLE IF EXISTS errcopy, errcopy_err, errcopy_temp; |
| |
| CREATE TABLE errcopy(a int, b int, c text) distributed by (a); |
| INSERT INTO errcopy select i, i, case when i <> 5 then i end || '_text' from generate_series(1, 10)i; |
| COPY errcopy to '/tmp/errcopy.csv' csv null ''; |
| |
| -- check if not null constraint not affect error log. |
| TRUNCATE errcopy; |
| ALTER table errcopy ALTER c SET NOT null; |
| |
| COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; |
| |
| SELECT * FROM errcopy; |
| |
| -- reject rows with invalid format for int |
| ALTER table errcopy ALTER c DROP NOT null; |
| ALTER table errcopy DROP COLUMN c; |
| ALTER table errcopy ADD COLUMN c int; |
| |
| COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; |
| SELECT * FROM errcopy; |
| SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); |
| |
| -- reject one row with extra column, one row with fewer columns |
| TRUNCATE errcopy; |
| SELECT gp_truncate_error_log('errcopy'); |
| |
| COPY (select i::text || ',' || i::text || case when i = 4 then '' else ',' || i::text || case when i = 5 then ',5' else '' end end from generate_series(1, 10)i) to '/tmp/errcopy.csv'; |
| COPY errcopy from '/tmp/errcopy.csv' csv null '' log errors segment reject limit 10 rows; |
| |
| SELECT * FROM errcopy ORDER BY a; |
| SELECT relname, errmsg, rawdata FROM gp_read_error_log('errcopy'); |
| |
| -- metacharacter |
| TRUNCATE errcopy; |
| COPY errcopy from stdin csv newline 'LF' log errors segment reject limit 3 rows; |
| 1,2,0 |
| 1,3,4^M |
| 1,3,3 |
| \. |
| |
| SELECT * FROM errcopy; |
| |
| -- exceed reject limit |
| TRUNCATE errcopy; |
| SELECT gp_truncate_error_log('errcopy'); |
| |
| COPY errcopy from stdin delimiter E'\t' log errors segment reject limit 3 rows; |
| 1 2 0 |
| 1 3 4 |
| 1 4 |
| 1 2 |
| 1 |
| 1 3 0 |
| 1 30 999 |
| \. |
| SELECT * FROM errcopy; |
| SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); |
| |
| -- abort and keep |
| TRUNCATE errcopy; |
| SELECT gp_truncate_error_log('errcopy'); |
| |
| COPY errcopy from stdin delimiter '/' log errors segment reject limit 3 rows; |
| 1/2/3 |
| 1/5 |
| 7/8/9 |
| 1/11/12/ |
| 1 |
| 1/17/18 |
| \. |
| SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('errcopy'); |
| |
| -- exceed reject limit on segment |
| DROP TABLE IF EXISTS segment_reject_limit; |
| CREATE TABLE segment_reject_limit (a int,b char) distributed by (a); |
| INSERT INTO segment_reject_limit values(1,'1'); |
| INSERT INTO segment_reject_limit values(1,'2'); |
| INSERT INTO segment_reject_limit values(1,'a'); |
| INSERT INTO segment_reject_limit values(1,'b'); |
| |
| COPY segment_reject_limit TO '/tmp/segment_reject_limit<SEGID>.csv' on segment; |
| |
| DROP TABLE IF EXISTS segment_reject_limit_from; |
| CREATE TABLE segment_reject_limit_from (a int,b int); |
| COPY segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' on segment log errors segment reject limit 2 rows; |
| |
| SELECT * FROM segment_reject_limit_from; |
| SELECT relname, filename, bytenum, errmsg FROM gp_read_error_log('segment_reject_limit_from'); |
| -- not exceed reject limit on segment |
| COPY segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' on segment log errors segment reject limit 3 rows; |
| SELECT * FROM segment_reject_limit_from; |
| |
| -- STDIN is not support by copy from on segment and copy program |
| COPY segment_reject_limit_from from STDIN on segment; |
| COPY segment_reject_limit_from from PROGRAM STDIN; |
| SELECT * FROM segment_reject_limit_from; |
| |
| -- STDOUT is not support by copy to on segment and copy program |
| COPY segment_reject_limit_from to STDOUT on segment; |
| COPY segment_reject_limit_from to PROGRAM STDOUT; |
| |
| -- 'COPY (SELECT ...) TO' has supported 'ON SEGMENT' |
| COPY (SELECT * FROM segment_reject_limit_from) TO '/tmp/segment_reject_limit<SEGID>.csv' ON SEGMENT; |
| |
| -- 'COPY (SELECT ...) TO' on utility mode |
| CREATE EXTERNAL WEB TABLE copy_cmd_utility(a text, b int) |
| EXECUTE E'PGOPTIONS="-c gp_role=utility" \\ |
| psql -X -p $GP_MASTER_PORT $GP_DATABASE $GP_USER -c \\ |
| "COPY (SELECT * FROM pg_class) TO \'/dev/null\'"' |
| ON COORDINATOR FORMAT 'text' (DELIMITER ' '); |
| SELECT a FROM copy_cmd_utility; |
| DROP EXTERNAL WEB TABLE copy_cmd_utility; |
| |
| -- SREH is not supported by COPY TO. |
| COPY segment_reject_limit_from to STDOUT log errors segment reject limit 3 rows; |
| |
| -- \copy from doesn't support on segment |
| --on segment lower case |
| \COPY segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' on segment; |
| --on segment with spaces |
| \COPY segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' on segment; |
| --on segment are capital |
| \COPY segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' ON SEGMENT; |
| --on segment with \t |
| \copy segment_reject_limit_from from '/tmp/segment_reject_limit<SEGID>.csv' on segment; |
| |
| -- \copy to doesn't support on segment |
| --on segment lower case |
| \COPY segment_reject_limit_from to '/tmp/copy_on_segment<SEGID>.csv' on segment; |
| --on segment with spaces |
| \COPY segment_reject_limit_from to '/tmp/copy_on_segment<SEGID>.csv' on segment; |
| --on segment are capital |
| \COPY segment_reject_limit_from to '/tmp/copy_on_segment<SEGID>.csv' ON SEGMENT; |
| --on segment with \t |
| \copy segment_reject_limit_from from '/tmp/copy_on_segment<SEGID>.csv' on segment; |
| |
| -- \copy to/from 'stdin'/'stdout' (quoted) |
| \copy segment_reject_limit_from to 'stdin'; |
| \copy segment_reject_limit_from from 'stdin'; |
| \copy segment_reject_limit_from to 'stdout'; |
| \copy segment_reject_limit_from from 'stdout'; |
| \!rm stdin |
| \!rm stdout |
| |
| -- gp_initial_bad_row_limit guc test. This guc allows user to set the initial |
| -- number of rows which can contain errors before the database stops loading |
| -- the data. If there is a valid row within the first 'n' rows specified by |
| -- this guc, the database continues to load the data. |
| DROP TABLE IF EXISTS test_first_segment_reject_limit; |
| CREATE TABLE test_first_segment_reject_limit (a int, b text); |
| SET gp_initial_bad_row_limit = 2; |
| COPY test_first_segment_reject_limit FROM STDIN WITH DELIMITER '|' segment reject limit 20; |
| error0 |
| error1 |
| error2 |
| error3 |
| 1|1_number |
| 2|2_number |
| 3|3_number |
| 4|4_number |
| 5|5_number |
| 5|5_number |
| 6|6_number |
| 7|7_number |
| \. |
| |
| -- should go through fine |
| SET gp_initial_bad_row_limit = 6; |
| COPY test_first_segment_reject_limit FROM STDIN WITH DELIMITER '|' segment reject limit 20; |
| error0 |
| error1 |
| error2 |
| error3 |
| 1|1_number |
| 2|2_number |
| 3|3_number |
| 4|4_number |
| 5|5_number |
| 5|5_number |
| 6|6_number |
| 7|7_number |
| \. |
| SELECT COUNT(*) FROM test_first_segment_reject_limit; |
| |
| -- start_ignore |
| DROP TABLE IF EXISTS test_copy_on_segment; |
| DROP TABLE IF EXISTS test_copy_on_segment_nocol; |
| DROP TABLE IF EXISTS test_copy_on_segment_array; |
| DROP TABLE IF EXISTS test_copy_on_segment_array_1; |
| DROP TABLE IF EXISTS test_copy_on_segment_2dim_array; |
| DROP TABLE IF EXISTS test_copy_on_segment_2dim_array_1; |
| DROP TABLE IF EXISTS test_copy_on_segment_withoids; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_txt; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_binary; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_csv; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_withoids; |
| DROP TABLE IF EXISTS onek_copy_from_onsegment; |
| DROP EXTERNAL TABLE IF EXISTS rm_copy_onsegment_files; |
| -- end_ignore |
| |
| CREATE TABLE test_copy_on_segment_nocol (); |
| COPY test_copy_on_segment_nocol TO '/tmp/valid_filename_nocol<SEGID>.txt' ON SEGMENT; |
| COPY test_copy_on_segment_nocol FROM '/tmp/valid_filename_nocol<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_nocol; |
| |
| COPY (select * from test_copy_on_segment_nocol) TO '/tmp/valid_filename_nocol<SEGID>.txt' ON SEGMENT; |
| COPY test_copy_on_segment_nocol FROM '/tmp/valid_filename_nocol<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_nocol; |
| |
| CREATE TABLE test_copy_on_segment_array (a int[], b text) DISTRIBUTED BY (a); |
| INSERT INTO test_copy_on_segment_array VALUES ('{1,2,3}', 'sd'); |
| INSERT INTO test_copy_on_segment_array VALUES ('{2,2,3}', 'fg'); |
| INSERT INTO test_copy_on_segment_array VALUES ('{3,2,1}', 'hj'); |
| INSERT INTO test_copy_on_segment_array VALUES ('{233,2,1}', 'hj'); |
| INSERT INTO test_copy_on_segment_array VALUES ('{666,2,1}', 'hj'); |
| INSERT INTO test_copy_on_segment_array VALUES ('{3,555,1}', 'hj'); |
| COPY test_copy_on_segment_array TO '/tmp/valid_filename_array<SEGID>.txt' ON SEGMENT; |
| |
| CREATE TABLE test_copy_on_segment_array_1 (a int[], b text) DISTRIBUTED BY (a); |
| COPY test_copy_on_segment_array_1 FROM '/tmp/valid_filename_array<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_array EXCEPT SELECT * FROM test_copy_on_segment_array_1; |
| |
| delete from test_copy_on_segment_array_1; |
| COPY (select * from test_copy_on_segment_array) TO '/tmp/valid_filename_array_select<SEGID>.txt' ON SEGMENT; |
| COPY test_copy_on_segment_array_1 FROM '/tmp/valid_filename_array_select<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_array EXCEPT SELECT * FROM test_copy_on_segment_array_1; |
| |
| CREATE TABLE test_copy_on_segment_2dim_array (a int[][]) DISTRIBUTED BY (a); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,2,3},{2,5,9}}'); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,8,3},{2,5,9}}'); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,9,3},{2,9,9}}'); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,3,3},{2,6,9}}'); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,233,3},{2,5,9}}'); |
| INSERT INTO test_copy_on_segment_2dim_array VALUES ('{{1,666,3},{2,555,9}}'); |
| COPY test_copy_on_segment_2dim_array TO '/tmp/valid_filename_2dim_array<SEGID>.txt' ON SEGMENT; |
| |
| CREATE TABLE test_copy_on_segment_2dim_array_1 (a int[][]) DISTRIBUTED BY (a); |
| COPY test_copy_on_segment_2dim_array_1 FROM '/tmp/valid_filename_2dim_array<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_2dim_array EXCEPT SELECT * FROM test_copy_on_segment_2dim_array_1; |
| |
| delete from test_copy_on_segment_2dim_array_1; |
| COPY (select * from test_copy_on_segment_2dim_array) TO '/tmp/valid_filename_2dim_array_select<SEGID>.txt' ON SEGMENT; |
| COPY test_copy_on_segment_2dim_array_1 FROM '/tmp/valid_filename_2dim_array_select<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_on_segment_2dim_array EXCEPT SELECT * FROM test_copy_on_segment_2dim_array_1; |
| |
| CREATE TABLE test_copy_on_segment (a int, b text, c text) DISTRIBUTED BY (b); |
| INSERT INTO test_copy_on_segment VALUES (1, 's', 'd'); |
| INSERT INTO test_copy_on_segment VALUES (2, 'f', 'g'); |
| INSERT INTO test_copy_on_segment VALUES (3, 'h', 'j'); |
| INSERT INTO test_copy_on_segment VALUES (4, 'i', 'l'); |
| INSERT INTO test_copy_on_segment VALUES (5, 'q', 'w'); |
| |
| COPY test_copy_on_segment TO '/tmp/invalid_filename.txt' ON SEGMENT; |
| COPY test_copy_on_segment TO '/tmp/valid_filename<SEGID>.txt' ON SEGMENT; |
| COPY test_copy_on_segment TO '/tmp/valid_filename<SEGID>.bin' ON SEGMENT BINARY; |
| COPY test_copy_on_segment TO '/tmp/valid_filename<SEGID>.csv' WITH ON SEGMENT CSV QUOTE '"' FORCE QUOTE a,b,c ESCAPE E'\\' NULL '\N' DELIMITER ',' HEADER IGNORE EXTERNAL PARTITIONS; |
| |
| CREATE TABLE test_copy_from_on_segment_txt (LIKE test_copy_on_segment) DISTRIBUTED BY (b); |
| COPY test_copy_from_on_segment_txt FROM '/tmp/invalid_filename.txt' ON SEGMENT; |
| COPY test_copy_from_on_segment_txt FROM '/tmp/valid_filename<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_from_on_segment_txt ORDER BY a; |
| |
| CREATE TABLE test_copy_from_on_segment_binary (LIKE test_copy_on_segment) DISTRIBUTED BY (b); |
| COPY test_copy_from_on_segment_binary FROM '/tmp/valid_filename<SEGID>.bin' ON SEGMENT BINARY; |
| SELECT * FROM test_copy_from_on_segment_binary ORDER BY a; |
| |
| CREATE TABLE test_copy_from_on_segment_csv (LIKE test_copy_on_segment) DISTRIBUTED BY (b); |
| COPY test_copy_from_on_segment_csv FROM '/tmp/valid_filename<SEGID>.csv' WITH ON SEGMENT CSV QUOTE '"' ESCAPE E'\\' NULL '\N' DELIMITER ',' HEADER IGNORE EXTERNAL PARTITIONS; |
| SELECT * FROM test_copy_from_on_segment_csv ORDER BY a; |
| |
| COPY (select * from test_copy_on_segment) TO '/tmp/invalid_filename_select.txt' ON SEGMENT; |
| COPY (select * from test_copy_on_segment) TO '/tmp/valid_filename_select<SEGID>.txt' ON SEGMENT; |
| COPY (select * from test_copy_on_segment) TO '/tmp/valid_filename_select<SEGID>.bin' ON SEGMENT BINARY; |
| COPY test_copy_on_segment TO '/tmp/valid_filename_select<SEGID>.csv' WITH ON SEGMENT CSV QUOTE '"' FORCE QUOTE a,b,c ESCAPE E'\\' NULL '\N' DELIMITER ',' HEADER; |
| |
| delete from test_copy_from_on_segment_txt; |
| COPY test_copy_from_on_segment_txt FROM '/tmp/invalid_filename_select.txt' ON SEGMENT; |
| COPY test_copy_from_on_segment_txt FROM '/tmp/valid_filename_select<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM test_copy_from_on_segment_txt ORDER BY a; |
| |
| delete from test_copy_from_on_segment_binary; |
| COPY test_copy_from_on_segment_binary FROM '/tmp/valid_filename_select<SEGID>.bin' ON SEGMENT BINARY; |
| SELECT * FROM test_copy_from_on_segment_binary ORDER BY a; |
| |
| delete from test_copy_from_on_segment_csv; |
| COPY test_copy_from_on_segment_csv FROM '/tmp/valid_filename_select<SEGID>.csv' WITH ON SEGMENT CSV QUOTE '"' ESCAPE E'\\' NULL '\N' DELIMITER ',' HEADER; |
| SELECT * FROM test_copy_from_on_segment_csv ORDER BY a; |
| |
| CREATE TABLE onek_copy_onsegment ( |
| unique1 int4, |
| unique2 int4, |
| two int4, |
| four int4, |
| ten int4, |
| twenty int4, |
| hundred int4, |
| thousand int4, |
| twothousand int4, |
| fivethous int4, |
| tenthous int4, |
| odd int4, |
| even int4, |
| stringu1 name, |
| stringu2 name, |
| string4 name |
| ) DISTRIBUTED BY (two,four,odd); |
| \COPY onek_copy_onsegment FROM 'data/onek.data'; |
| SELECT count(*) FROM onek_copy_onsegment; |
| COPY onek_copy_onsegment TO '/tmp/valid_filename_onek_copy_onsegment<SEGID>.txt' ON SEGMENT; |
| |
| CREATE TABLE onek_copy_from_onsegment (LIKE onek_copy_onsegment); |
| COPY onek_copy_from_onsegment FROM '/tmp/valid_filename_onek_copy_onsegment<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM onek_copy_onsegment EXCEPT SELECT * FROM onek_copy_from_onsegment; |
| SELECT count(*) FROM onek_copy_from_onsegment; |
| |
| COPY (select * from onek_copy_onsegment) TO '/tmp/valid_filename_onek_copy_onsegment_select<SEGID>.txt' ON SEGMENT; |
| |
| delete from onek_copy_from_onsegment; |
| COPY onek_copy_from_onsegment FROM '/tmp/valid_filename_onek_copy_onsegment_select<SEGID>.txt' ON SEGMENT; |
| SELECT * FROM onek_copy_onsegment EXCEPT SELECT * FROM onek_copy_from_onsegment; |
| SELECT count(*) FROM onek_copy_from_onsegment; |
| |
| CREATE EXTERNAL WEB TABLE rm_copy_onsegment_files (a int) |
| EXECUTE E'(rm -rf /tmp/*valid_filename*.*)' |
| ON SEGMENT 0 |
| FORMAT 'text'; |
| SELECT * FROM rm_copy_onsegment_files; |
| |
| DROP TABLE IF EXISTS test_copy_on_segment; |
| DROP TABLE IF EXISTS test_copy_on_segment_nocol; |
| DROP TABLE IF EXISTS test_copy_on_segment_array; |
| DROP TABLE IF EXISTS test_copy_on_segment_array_1; |
| DROP TABLE IF EXISTS test_copy_on_segment_2dim_array; |
| DROP TABLE IF EXISTS test_copy_on_segment_2dim_array_1; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_txt; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_binary; |
| DROP TABLE IF EXISTS test_copy_from_on_segment_csv; |
| DROP TABLE IF EXISTS onek_copy_from_onsegment; |
| DROP EXTERNAL TABLE IF EXISTS rm_copy_onsegment_files; |
| |
| -- Test for COPY FROM/TO with mulitple blocks data file |
| -- start_ignore |
| DROP TABLE IF EXISTS LINEITEM; |
| DROP TABLE IF EXISTS LINEITEM_1; |
| DROP TABLE IF EXISTS LINEITEM_2; |
| DROP TABLE IF EXISTS LINEITEM_3; |
| DROP TABLE IF EXISTS LINEITEM_4; |
| DROP TABLE IF EXISTS LINEITEM_5; |
| DROP TABLE IF EXISTS LINEITEM_6; |
| DROP TABLE IF EXISTS LINEITEM_7; |
| DROP TABLE IF EXISTS LINEITEM_8; |
| -- end_ignore |
| CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL, |
| L_PARTKEY INTEGER NOT NULL, |
| L_SUPPKEY INTEGER NOT NULL, |
| L_LINENUMBER INTEGER NOT NULL, |
| L_QUANTITY DECIMAL(15,2) NOT NULL, |
| L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, |
| L_DISCOUNT DECIMAL(15,2) NOT NULL, |
| L_TAX DECIMAL(15,2) NOT NULL, |
| L_RETURNFLAG CHAR(1) NOT NULL, |
| L_LINESTATUS CHAR(1) NOT NULL, |
| L_SHIPDATE DATE NOT NULL, |
| L_COMMITDATE DATE NOT NULL, |
| L_RECEIPTDATE DATE NOT NULL, |
| L_SHIPINSTRUCT CHAR(25) NOT NULL, |
| L_SHIPMODE CHAR(10) NOT NULL, |
| L_COMMENT VARCHAR(44) NOT NULL); |
| |
| -- relation doesn't exist |
| COPY LINEITEM_1 FROM PROGRAM 'yes' CSV; |
| COPY LINEITEM_1 TO PROGRAM 'yes' CSV; |
| |
| CREATE TABLE LINEITEM_1 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_2 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_3 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_4 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_5 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_6 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_7 (LIKE LINEITEM); |
| CREATE TABLE LINEITEM_8 (LIKE LINEITEM); |
| |
| \getenv abs_srcdir PG_ABS_SRCDIR |
| \set lineitem_csv :abs_srcdir '/data/lineitem.csv' |
| COPY LINEITEM FROM :'lineitem_csv' WITH DELIMITER '|' CSV; |
| ANALYZE LINEITEM; |
| SELECT COUNT(*) FROM LINEITEM; |
| COPY LINEITEM TO '/tmp/lineitem.csv' CSV; |
| COPY LINEITEM TO '/tmp/lineitem_s<SEGID>.csv' ON SEGMENT CSV; |
| COPY (select * from LINEITEM) TO '/tmp/lineitem_qs<SEGID>.csv' ON SEGMENT CSV; |
| |
| COPY LINEITEM_1 FROM '/tmp/lineitem.csv' CSV; |
| SELECT COUNT(*) FROM LINEITEM_1; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_1; |
| |
| COPY LINEITEM_2 FROM '/tmp/lineitem_s<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM LINEITEM_2; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_2; |
| |
| COPY LINEITEM_3 FROM '/tmp/lineitem_qs<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM LINEITEM_3; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_3; |
| |
| COPY LINEITEM TO PROGRAM 'cat > /tmp/lineitem_program.csv' CSV; |
| COPY LINEITEM_4 FROM PROGRAM 'cat /tmp/lineitem_program.csv' CSV; |
| SELECT COUNT(*) FROM LINEITEM_4; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_4; |
| |
| COPY (select * from LINEITEM) TO PROGRAM 'cat > /tmp/lineitem_program.csv' CSV; |
| COPY LINEITEM_5 FROM PROGRAM 'cat /tmp/lineitem_program.csv' CSV; |
| SELECT COUNT(*) FROM LINEITEM_5; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_5; |
| |
| COPY LINEITEM TO PROGRAM 'cat > /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV; |
| COPY LINEITEM_6 FROM PROGRAM 'cat /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM LINEITEM_6; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_6; |
| |
| COPY (select * from LINEITEM) TO PROGRAM 'cat > /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV; |
| COPY LINEITEM_7 FROM PROGRAM 'cat /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM LINEITEM_7; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_7; |
| |
| \COPY LINEITEM TO PROGRAM 'cat > /tmp/lineitem_program_client.csv' CSV; |
| \COPY LINEITEM_8 FROM PROGRAM 'cat /tmp/lineitem_program_client.csv' CSV; |
| SELECT COUNT(*) FROM LINEITEM_8; |
| SELECT * FROM LINEITEM EXCEPT SELECT * FROM LINEITEM_8; |
| |
| --Test for `COPY FROM ON SEGMENT` checking the distribution key restriction |
| -- start_matchsubs |
| -- m/^CONTEXT: COPY .*, line \d*: .*$/ |
| -- s/^CONTEXT: COPY .*, line \d*: .*$/CONTEXT: COPY xxxxx line x: xxx/ |
| -- end_matchsubs |
| -- start_ignore |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_CHECK_DISTKEY; |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_CHECK_TOW_DSITKEY; |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| DROP TABLE IF EXISTS COPY_FROM_PARTITION_TABLE; |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION; |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_DIST_RANDOMLY; |
| DROP TABLE IF EXISTS COPY_ON_SEGMENT_PARTION_DIST_RANDOMLY; |
| -- end_ignore |
| CREATE TABLE COPY_ON_SEGMENT_CHECK_DISTKEY(a int)DISTRIBUTED BY(a); |
| INSERT INTO COPY_ON_SEGMENT_CHECK_DISTKEY SELECT generate_series(0,10); |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY<SEGID>.csv' ON SEGMENT CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY0.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY<SEGID>.csv' ON SEGMENT CSV; |
| SET gp_enable_segment_copy_checking=off; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY<SEGID>.csv' ON SEGMENT CSV; |
| ALTER TABLE COPY_ON_SEGMENT_CHECK_DISTKEY SET DISTRIBUTED RANDOMLY; |
| SET gp_enable_segment_copy_checking=on; |
| |
| CREATE TABLE COPY_ON_SEGMENT_CHECK_TOW_DSITKEY(a int,b int)DISTRIBUTED BY(a,b); |
| INSERT INTO COPY_ON_SEGMENT_CHECK_TOW_DSITKEY SELECT generate_series(0,10),generate_series(0,10); |
| COPY COPY_ON_SEGMENT_CHECK_TOW_DSITKEY to '/tmp/COPY_ON_SEGMENT_CHECK_TOW_DSITKEY<SEGID>.csv' ON SEGMENT CSV; |
| COPY COPY_ON_SEGMENT_CHECK_TOW_DSITKEY to '/tmp/COPY_ON_SEGMENT_CHECK_TOW_DSITKEY0.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_TOW_DSITKEY FROM '/tmp/COPY_ON_SEGMENT_CHECK_TOW_DSITKEY<SEGID>.csv' ON SEGMENT CSV; |
| |
| -- COPY FRON ON SEGMENT DISTRIBUTED RANDOMLY |
| CREATE TABLE COPY_ON_SEGMENT_DIST_RANDOMLY(a int) DISTRIBUTED RANDOMLY; |
| COPY COPY_ON_SEGMENT_DIST_RANDOMLY FROM PROGRAM 'echo <SEGID>' ON SEGMENT; |
| |
| -- COPY FROM ON SEGMENT partitioned table |
| CREATE TABLE COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED(a int) DISTRIBUTED BY (a) PARTITION BY range(a) ( START (0) END (10) EVERY (5)); |
| INSERT INTO COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED SELECT generate_series(0,9); |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED<SEGID>.csv' ON SEGMENT CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| |
| -- This adds data to the segment 0's file, that doesn't belong to that |
| -- segment. COPYing that back to the table should throw an error. |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED_1_prt_1 to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED0.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| |
| -- But if we turn off the checks for data distribution, the system will |
| -- merrily load it in anyway. |
| set gp_vmem_idle_resource_timeout=1; |
| SET gp_enable_segment_copy_checking=off; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED<SEGID>.csv' ON SEGMENT CSV; |
| SET gp_enable_segment_copy_checking=on; |
| set gp_vmem_idle_resource_timeout=18000; |
| |
| -- But make sure we still perform the checks for the other partition that is |
| -- hash distributed. |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED_1_prt_2 to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED0.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED<SEGID>.csv' ON SEGMENT CSV; |
| |
| -- COPY FROM ON SEGMENT partitioned table distributed randomly |
| CREATE TABLE COPY_ON_SEGMENT_PARTION_DIST_RANDOMLY (a int) DISTRIBUTED RANDOMLY PARTITION BY range(a) ( START (0) END (10) EVERY (5)); |
| COPY COPY_ON_SEGMENT_PARTION_DIST_RANDOMLY FROM PROGRAM 'echo <SEGID>' ON SEGMENT; |
| |
| -- COPY FROM partitioned table |
| TRUNCATE COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| INSERT INTO COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED SELECT generate_series(0,9); |
| SELECT COUNT(*) FROM COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED.csv' CSV; |
| SELECT COUNT(*) FROM COPY_ON_SEGMENT_CHECK_DISTKEY_PARTIONED; |
| |
| --COPY FROM partition table mulitple attributes |
| CREATE TABLE COPY_FROM_PARTITION_TABLE (a text ,b int) PARTITION BY range(b) (START (0) END (10) EVERY(5)); |
| INSERT INTO COPY_FROM_PARTITION_TABLE values('aa',1); |
| INSERT INTO COPY_FROM_PARTITION_TABLE values('bb',2); |
| INSERT INTO COPY_FROM_PARTITION_TABLE values('cc',8); |
| SELECT COUNT(*) FROM COPY_FROM_PARTITION_TABLE; |
| COPY COPY_FROM_PARTITION_TABLE TO '/tmp/COPY_FROM_PARTITION_TABLE.txt'; |
| COPY COPY_FROM_PARTITION_TABLE FROM '/tmp/COPY_FROM_PARTITION_TABLE.txt'; |
| SELECT COUNT(*) FROM COPY_FROM_PARTITION_TABLE; |
| |
| --COPY FROM ON SEGMENT SUBPARTITION table |
| CREATE TABLE COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION(a int,b int) DISTRIBUTED BY (a) PARTITION BY range(a) |
| SUBPARTITION BY RANGE (b) |
| SUBPARTITION TEMPLATE ( |
| START (0) END (10) EVERY (3) |
| ) |
| ( START (0) END (10) EVERY (5)); |
| INSERT INTO COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION SELECT generate_series(0,9),generate_series(0,9); |
| COPY (SELECT * FROM COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION ORDER BY a, b) to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION<SEGID>.csv' ON SEGMENT CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION<SEGID>.csv' ON SEGMENT CSV; |
| SELECT COUNT(*) FROM COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION; |
| |
| COPY (VALUES |
| (2, 2), |
| (0, 0) |
| ) to '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION0.csv' CSV; |
| COPY COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION FROM '/tmp/COPY_ON_SEGMENT_CHECK_DISTKEY_SUBPARTITION<SEGID>.csv' ON SEGMENT CSV; |
| |
| -- start_ignore |
| DROP TABLE IF EXISTS LINEITEM_1; |
| DROP TABLE IF EXISTS LINEITEM_2; |
| DROP TABLE IF EXISTS LINEITEM_3; |
| DROP TABLE IF EXISTS LINEITEM_4; |
| DROP TABLE IF EXISTS LINEITEM_5; |
| -- end_ignore |
| |
| -- Test for COPY PROGRAM PRINT STDERR |
| -- start_ignore |
| DROP TABLE IF EXISTS COPY_TO_PROGRAM_ERROR; |
| DROP TABLE IF EXISTS COPY_FROM_PROGRAM_ERROR; |
| -- end_ignore |
| CREATE TABLE COPY_TO_PROGRAM_ERROR(dir text); |
| |
| COPY COPY_TO_PROGRAM_ERROR TO PROGRAM 'echo && echo "error" >&2 && exit 255'; |
| COPY COPY_TO_PROGRAM_ERROR TO PROGRAM 'echo <SEGID>&& echo "error" >&2 && exit 255' on segment; |
| COPY (SELECT * FROM COPY_TO_PROGRAM_ERROR) TO PROGRAM 'echo <SEGID>&& echo "error" >&2 && exit 255' on segment; |
| |
| CREATE TABLE COPY_FROM_PROGRAM_ERROR(a int); |
| |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'echo 1; echo "error" >&2 && exit 255'; |
| SELECT COUNT(*) FROM COPY_FROM_PROGRAM_ERROR; |
| INSERT INTO COPY_FROM_PROGRAM_ERROR VALUES(0); |
| COPY COPY_FROM_PROGRAM_ERROR TO '/tmp/program_error_<SEGID>.csv' ON SEGMENT; |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'cat /tmp/program_error_<SEGID>.csv && echo "error" >&2 && exit 255' ON SEGMENT; |
| SELECT COUNT(*) FROM COPY_FROM_PROGRAM_ERROR; |
| |
| -- Test for COPY PROGRAM ENVIROMENT VAR |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'echo $GP_SEGMENT_ID'; |
| SELECT COUNT(*) FROM COPY_FROM_PROGRAM_ERROR; |
| \COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'echo $GP_SEGMENT_ID'; |
| SELECT COUNT(*) FROM COPY_FROM_PROGRAM_ERROR; |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'echo $GP_SEGMENT_I'; |
| SELECT COUNT(*) FROM COPY_FROM_PROGRAM_ERROR; |
| SET gp_enable_segment_copy_checking=off; |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'printf "$GP_SEGMENT_ID\n<SEGID>"' on segment; |
| COPY COPY_FROM_PROGRAM_ERROR FROM PROGRAM 'printf "$GP_SEGMENT_I\n<SEGID>"' on segment; |
| ALTER TABLE COPY_FROM_PROGRAM_ERROR SET DISTRIBUTED RANDOMLY; |
| SET gp_enable_segment_copy_checking=on; |
| |
| -- Test that xlog records are generated for COPY in the same transaction as |
| -- created table. The actual validation for this test will be performed once the |
| -- gp_replica_check tool is enabled. |
| BEGIN; |
| CREATE TABLE copy_from_same_txn(a int, b int); |
| COPY copy_from_same_txn FROM stdin; |
| 1 1 |
| 2 2 |
| 3 3 |
| \. |
| COMMIT; |
| |
| -- Test that COPY can be aborted by cancel request after the COPY is dispatched. |
| |
| SELECT gp_inject_fault('cdb_copy_start_after_dispatch', 'reset', 1); |
| SELECT gp_inject_fault('cdb_copy_start_after_dispatch', 'interrupt', 1); |
| |
| COPY lineitem TO '/tmp/aborted.data'; |
| |
| SELECT gp_inject_fault('cdb_copy_start_after_dispatch', 'reset', 1); |
| |
| |
| -- Test external partition |
| CREATE TABLE sales ( |
| id integer, |
| date date, |
| amt numeric(10,2) |
| ) DISTRIBUTED BY (id) PARTITION BY RANGE(date) |
| ( |
| PARTITION jan17 START ('2017-01-01'::date) END ('2017-02-01'::date) WITH (tablename='sales_1_prt_jan17', appendonly=false ), |
| PARTITION feb17 START ('2017-02-01'::date) END ('2017-03-01'::date) WITH (tablename='sales_1_prt_feb17', appendonly=false ), |
| PARTITION mar17 START ('2017-03-01'::date) END ('2017-04-01'::date) WITH (tablename='sales_1_prt_mar17', appendonly=false ), |
| PARTITION apr17 START ('2017-04-01'::date) END ('2017-05-01'::date) WITH (tablename='sales_1_prt_apr17', appendonly=false ), |
| PARTITION may17 START ('2017-05-01'::date) END ('2017-06-01'::date) WITH (tablename='sales_1_prt_may17', appendonly=false ), |
| PARTITION jun17 START ('2017-06-01'::date) END ('2017-07-01'::date) WITH (tablename='sales_1_prt_jun17', appendonly=false ), |
| PARTITION jul17 START ('2017-07-01'::date) END ('2017-08-01'::date) WITH (tablename='sales_1_prt_jul17', appendonly=false ), |
| PARTITION aug17 START ('2017-08-01'::date) END ('2017-09-01'::date) WITH (tablename='sales_1_prt_aug17', appendonly=false ), |
| PARTITION sep17 START ('2017-09-01'::date) END ('2017-10-01'::date) WITH (tablename='sales_1_prt_sep17', appendonly=false ), |
| PARTITION oct17 START ('2017-10-01'::date) END ('2017-11-01'::date) WITH (tablename='sales_1_prt_oct17', appendonly=false ), |
| PARTITION nov17 START ('2017-11-01'::date) END ('2017-12-01'::date) WITH (tablename='sales_1_prt_nov17', appendonly=false ), |
| PARTITION dec17 START ('2017-12-01'::date) END ('2018-01-01'::date) WITH (tablename='sales_1_prt_dec17', appendonly=false ) |
| ); |
| COPY sales (id, date, amt) FROM stdin; |
| 1 2017-01-01 20.00 |
| 3 2017-03-01 20.00 |
| 25 2017-05-01 20.00 |
| 1 2017-01-01 20.00 |
| 3 2017-03-01 20.00 |
| 25 2017-05-01 20.00 |
| 2 2017-02-01 20.00 |
| 4 2017-04-01 20.00 |
| 8 2017-08-01 20.00 |
| 2 2017-02-01 20.00 |
| 4 2017-04-01 20.00 |
| 8 2017-08-01 20.00 |
| 15 2017-05-01 20.00 |
| 5 2017-05-01 20.00 |
| 9 2017-09-01 20.00 |
| 15 2017-05-01 20.00 |
| 5 2017-05-01 20.00 |
| 9 2017-09-01 20.00 |
| 7 2017-07-01 20.00 |
| 11 2017-11-01 20.00 |
| 7 2017-07-01 20.00 |
| 11 2017-11-01 20.00 |
| 18 2017-08-01 20.00 |
| 12 2017-12-01 20.00 |
| 18 2017-08-01 20.00 |
| 12 2017-12-01 20.00 |
| \. |
| -- Set QUIET off, to also test the row counts that COPY returns |
| \set QUIET 'off' |
| |
| COPY sales TO '/tmp/test_sales_<SEGID>' ON SEGMENT; |
| TRUNCATE sales; |
| COPY sales FROM '/tmp/test_sales_<SEGID>' ON SEGMENT; |
| |
| CREATE EXTERNAL WEB TABLE ext_dec17(LIKE sales_1_prt_dec17) EXECUTE 'printf "12\t2017-12-01\t21.00\n"' ON COORDINATOR FORMAT 'text'; |
| ALTER TABLE sales EXCHANGE PARTITION dec17 WITH TABLE ext_dec17; |
| DROP TABLE ext_dec17; |
| COPY sales TO PROGRAM 'cat > /tmp/test_sales_all' IGNORE EXTERNAL PARTITIONS; |
| COPY sales TO PROGRAM 'cat > /tmp/test_sales_with_external'; |
| COPY sales TO PROGRAM 'cat > /tmp/test_sales_<SEGID>' ON SEGMENT IGNORE EXTERNAL PARTITIONS; |
| |
| -- Verify that the files don't contain the row from the external partition. |
| \set QUIET 'on' |
| |
| CREATE EXTERNAL WEB TABLE pg_temp.read_result(line text) EXECUTE 'cat /tmp/test_sales_all' ON COORDINATOR FORMAT 'text' (DELIMITER 'off'); |
| SELECT * FROM pg_temp.read_result; |
| DROP EXTERNAL TABLE pg_temp.read_result; |
| |
| CREATE EXTERNAL WEB TABLE pg_temp.read_result(line text) EXECUTE 'cat /tmp/test_sales_with_external' ON COORDINATOR FORMAT 'text' (DELIMITER 'off'); |
| SELECT * FROM pg_temp.read_result; |
| DROP EXTERNAL TABLE pg_temp.read_result; |
| |
| CREATE EXTERNAL WEB TABLE pg_temp.read_result(line text) EXECUTE 'cat /tmp/test_sales_$GP_SEGMENT_ID' FORMAT 'text' (DELIMITER 'off'); |
| SELECT * FROM pg_temp.read_result; |
| DROP EXTERNAL TABLE pg_temp.read_result; |
| |
| DROP TABLE sales; |
| |
| CREATE TABLE ao_copy(c int) WITH (appendonly=true); |
| COPY ao_copy TO '/tmp/ao<SEGID>.txt' ON SEGMENT; |
| COPY ao_copy FROM '/tmp/ao<SEGID>.txt' ON SEGMENT; |
| DROP TABLE ao_copy; |
| |
| -- |
| -- Test row counts |
| -- |
| -- We have to disable QUIET mode for these, so that we get the command tags, |
| -- like "COPY 10", in the output. |
| \set QUIET off |
| copy (select generate_series(1, 10)) to '/tmp/a'; |
| |
| create temp table t (id int4); |
| copy t from '/tmp/a'; |
| copy t to '/tmp/b'; |
| copy t to '/tmp/b<SEGID>' on segment; |
| copy t from '/tmp/b<SEGID>' on segment; |
| select count(*) from t; |
| |
| \set QUIET on |
| |
| |
| -- |
| -- Test error handling during COPY TO |
| -- |
| -- To trigger an error, we use an output function that throws an |
| -- error on a particular value. The trigger value is 1234. |
| -- |
| CREATE TYPE broken_int4; |
| CREATE FUNCTION broken_int4in(cstring) |
| RETURNS broken_int4 |
| AS 'int4in' |
| LANGUAGE internal IMMUTABLE STRICT; |
| \getenv abs_builddir PG_ABS_BUILDDIR |
| \set regress_dll :abs_builddir '/regress.so' |
| |
| CREATE FUNCTION broken_int4out(broken_int4) |
| RETURNS cstring |
| AS :'regress_dll', 'broken_int4out' |
| LANGUAGE C IMMUTABLE STRICT; |
| |
| CREATE TYPE broken_int4 ( |
| internallength = 4, |
| input = broken_int4in, |
| output = broken_int4out, |
| alignment = int4, |
| passedbyvalue |
| ); |
| |
| -- avoid hitting the error when analyzing the table. |
| set gp_autostats_mode = 'None'; |
| |
| -- Create a table, using the funny datatype, and load it with integers |
| -- 1-10000. The input function works normally, so this works, but if you |
| -- try to select the row with value 1234 from it, the output function will |
| -- throw an error. |
| CREATE TABLE broken_type_test (b broken_int4); |
| insert into broken_type_test select g::text::broken_int4 from generate_series(1, 10000) g; |
| |
| -- Should work, since we don't hit the trigger value 1234. (In principle, |
| -- that's not guaranteed; there's no ORDER BY, so the system could return |
| -- any 10 rows. In practice, this seems pretty safe.) |
| copy (select * from broken_type_test limit 10) to '/tmp/g'; |
| |
| -- Should fail, because we try to output everything, including 1234 |
| copy (select * from broken_type_test) to '/tmp/g'; |
| copy broken_type_test to '/tmp/g'; |
| |
| -- Don't leave behind a table that you can't dump. |
| drop table broken_type_test; |
| drop type broken_int4 cascade; -- drops the I/O functions, too. |
| |
| -- Test COPY FROM and TO work for catalog tables in dispatch |
| -- connection |
| BEGIN; |
| SET allow_system_table_mods=on; |
| COPY gp_configuration_history from stdin with delimiter '|'; |
| 1900-01-01 00:00:00.000000-07|12345|Just testing COPY |
| \. |
| |
| COPY (select dbid from gp_configuration_history where dbid=12345) to stdin; |
| RESET allow_system_table_mods; |
| |
| -- cannot copy to a catalog table with allow_system_table_mods=off; |
| COPY gp_configuration_history from stdin with delimiter '|'; |
| ABORT; |
| |
| -- GPDB makes the database name, and many other things, available |
| -- as environment variables to the program. Test those. |
| -- |
| -- Perform these tests in a funnily named database, to test |
| -- escaping |
| set client_min_messages='warning'; |
| DROP DATABASE IF EXISTS "funny_copy""db'with\\quotes"; |
| reset client_min_messages; |
| CREATE DATABASE "funny_copy""db'with\\quotes"; |
| |
| \! python3 test_dbconn.py 1 |
| |
| \c "funny_copy""db'with\\quotes" |
| -- echo will behave differently on different platforms, force to use bash with -E option |
| COPY (SELECT 'data1') TO PROGRAM 'cat > /tmp/gpcopyenvtest; /usr/bin/env bash -c ''echo -E database in COPY TO: $GP_DATABASE >> /tmp/gpcopyenvtest '' ' ESCAPE 'OFF'; |
| |
| CREATE TABLE foo (t text); |
| COPY foo FROM PROGRAM 'cat /tmp/gpcopyenvtest' ESCAPE 'OFF'; |
| COPY foo FROM PROGRAM '/usr/bin/env bash -c ''echo -E database in COPY FROM: $GP_DATABASE''' ESCAPE 'OFF'; |
| |
| select * from foo; |
| |
| -- |
| -- Test copy a partitioned table whose columns' orders are not consistent between the root table and partitions. |
| -- |
| |
| -- 1. Test copy a partitioned table with a single distribution key on segment. |
| CREATE TABLE issue_14353 (a integer, b integer, c text) PARTITION BY RANGE (a) DISTRIBUTED BY (a); |
| CREATE TABLE issue_14353_prt_1 (b integer, a integer, c text) DISTRIBUTED BY (a); |
| CREATE TABLE issue_14353_def (a integer, b integer, c text) DISTRIBUTED BY (a); |
| |
| ALTER TABLE ONLY issue_14353 ATTACH PARTITION issue_14353_prt_1 FOR VALUES FROM (1) TO (2); |
| ALTER TABLE ONLY issue_14353 ATTACH PARTITION issue_14353_def DEFAULT; |
| INSERT INTO issue_14353 SELECT x, x%3, 'a' FROM generate_series(1, 20)x; |
| |
| -- Test that the data are successfully copied out and copied in on segment. |
| COPY issue_14353 TO '/tmp/issue_14353_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |
| COPY issue_14353 FROM '/tmp/issue_14353_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |
| |
| -- Test that gpdb emits an error message saying the data distribution is malformed. |
| \! cp /tmp/issue_14353_1.csv /tmp/issue_14353_0.csv |
| COPY issue_14353 FROM '/tmp/issue_14353_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |
| |
| -- 2. Test copy a partitioned table with multiple distribution keys on segment. |
| CREATE TABLE issue_14353_multi_dist (a integer, b integer, c text) PARTITION BY RANGE (a) DISTRIBUTED BY (a, c); |
| CREATE TABLE issue_14353_multi_dist_prt_1 (b integer, a integer, c text) DISTRIBUTED BY (a, c); |
| CREATE TABLE issue_14353_multi_dist_def (a integer, b integer, c text) DISTRIBUTED BY (a, c); |
| |
| ALTER TABLE ONLY issue_14353_multi_dist ATTACH PARTITION issue_14353__multi_dist_prt_1 FOR VALUES FROM (1) TO (2); |
| ALTER TABLE ONLY issue_14353_multi_dist ATTACH PARTITION issue_14353_multi_dist_def DEFAULT; |
| INSERT INTO issue_14353_multi_dist SELECT x, x%3, 'a' || (x%5)::text FROM generate_series(1, 20)x; |
| |
| -- Test that the data are successfully copied out and copied in on segment. |
| COPY issue_14353_multi_dist TO '/tmp/issue_14353_multi_dist_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |
| COPY issue_14353_multi_dist FROM '/tmp/issue_14353_multi_dist_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |
| |
| -- Test that gpdb emits an error message saying the data distribution is malformed. |
| \! cp /tmp/issue_14353_multi_dist_1.csv /tmp/issue_14353_multi_dist_0.csv |
| COPY issue_14353_multi_dist FROM '/tmp/issue_14353_multi_dist_<SEGID>.csv' WITH CSV DELIMITER ',' ON SEGMENT; |