| -- |
| -- external tables - short and simple functional tests. |
| -- |
| -- start_matchsubs |
| -- |
| -- # replace return code in error message (platform specific) |
| -- |
| -- m/ERROR\:\s+external table .* command ended with .* not found/ |
| -- s/nosuchcommand\:\s*(command)? not found/nosuchcommand\: NOT FOUND/ |
| -- |
| -- m/ERROR\:\s+external table .* command ended with .*No such file.*/ |
| -- s/nosuchfile\.txt\:\s*No such file (or directory)?/nosuchfile\.txt\: NO SUCH FILE/ |
| -- m/ERROR\:\s+external table .* command ended with .*No such file.*/i |
| -- s/cat\: (cannot open)? nosuchfile\.txt/cat\: nosuchfile\.txt/ |
| -- |
| -- # remove line number - redhat |
| -- m/ERROR\:\s+external table .* command ended with .*NOT FOUND.*/i |
| -- s/\s+line \d+\:// |
| -- # remove line number - Debian |
| -- m/ERROR\:\s+external table .* command ended with .*sh: 1: .*NOT FOUND.*/i |
| -- s/ sh: 1: / sh: / |
| -- |
| -- m/DETAIL: Found \d+ URLs and \d+ primary segments./ |
| -- s/Found.+// |
| -- |
| -- end_matchsubs |
| CREATE TABLE REG_REGION (R_REGIONKEY INT, R_NAME CHAR(25), R_COMMENT VARCHAR(152)) DISTRIBUTED BY (R_REGIONKEY); |
| |
| -- -------------------------------------- |
| -- 'file' protocol - (only CREATE, don't SELECT - won't work on distributed installation) |
| -- -------------------------------------- |
| CREATE EXTERNAL TABLE EXT_NATION ( N_NATIONKEY INTEGER , |
| N_NAME CHAR(25) , |
| N_REGIONKEY INTEGER , |
| N_COMMENT VARCHAR(152)) |
| location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| |
| CREATE EXTERNAL TABLE EXT_REGION (LIKE REG_REGION) |
| location ('file://@hostname@@abs_srcdir@/data/region.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| |
| -- Only tables with custom protocol should create dependency, due to a bug there |
| -- used to be entries created for non custom protocol tables with refobjid=0. |
| SELECT * FROM pg_depend WHERE refclassid = 'pg_extprotocol'::regclass and refobjid = 0; |
| |
| -- drop tables |
| |
| DROP EXTERNAL TABLE EXT_NATION; |
| DROP EXTERNAL TABLE EXT_REGION; |
| -- start_ignore |
| -- -------------------------------------- |
| -- check platform |
| -- -------------------------------------- |
| DROP TABLE IF EXISTS REG_REGION; |
| DROP TABLE IF EXISTS tableless_heap; |
| DROP TABLE IF EXISTS errlog_save; |
| DROP TABLE IF EXISTS exttab_insert_1; |
| DROP TABLE IF EXISTS exttab_ctas_1; |
| DROP TABLE IF EXISTS exttab_constraints_insert_1; |
| |
| DROP EXTERNAL TABLE IF EXISTS tableless_ext; |
| DROP EXTERNAL TABLE IF EXISTS ret_too_many_uris; |
| DROP EXTERNAL TABLE IF EXISTS wet_too_many_uris; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_error_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_3; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_4; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_5; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_6; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_7; |
| DROP EXTERNAL TABLE IF EXISTS exttab_constraints_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_cte_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_cte_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_permissions_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_permissions_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_permissions_3; |
| DROP EXTERNAL TABLE IF EXISTS exttab_subq_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_subq_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_subtxs_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_subtxs_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_txs_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_txs_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_udfs_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_udfs_2; |
| DROP EXTERNAL TABLE IF EXISTS exttab_views_3; |
| DROP EXTERNAL WEB TABLE IF EXISTS table_env; |
| DROP EXTERNAL WEB TABLE IF EXISTS table_master; |
| DROP EXTERNAL WEB TABLE IF EXISTS table_qry; |
| |
| DROP VIEW IF EXISTS exttab_views_3; |
| |
| DROP PROTOCOL IF EXISTS demoprot_untrusted; |
| DROP PROTOCOL IF EXISTS demoprot_untrusted2; |
| |
| drop external web table if exists check_ps; |
| CREATE EXTERNAL WEB TABLE check_ps (x text) |
| execute E'( (ps -ef || ps -aux) | grep gpfdist | grep -v grep)' |
| on SEGMENT 0 |
| format 'text'; |
| drop external web table if exists check_env; |
| CREATE EXTERNAL WEB TABLE check_env (x text) |
| execute E'( env | sort)' |
| on SEGMENT 0 |
| format 'text'; |
| select * from check_ps; |
| select * from check_env; |
| |
| drop external table check_ps; |
| drop external table check_env; |
| |
| -- end_ignore |
| -- table to get shell command "env" output which list all environment variable |
| CREATE EXTERNAL WEB TABLE table_env (val TEXT) |
| EXECUTE E'env' ON SEGMENT 0 |
| FORMAT 'TEXT' (ESCAPE 'OFF'); |
| SELECT * FROM table_env WHERE val LIKE 'GP_QUERY%' ORDER BY val ASC; |
| SELECT * FROM table_env WHERE val LIKE 'GP_QUERY%\%' ESCAPE '&' ORDER BY val ASC; |
| |
| -- ensure squelching on master |
| CREATE EXTERNAL WEB TABLE table_master (val TEXT) |
| EXECUTE E'cat @abs_srcdir@/data/lineitem.csv' ON MASTER |
| FORMAT 'TEXT' (ESCAPE 'OFF'); |
| BEGIN; |
| DECLARE _psql_cursor NO SCROLL CURSOR FOR SELECT 1 FROM table_master; |
| FETCH FORWARD 1 FROM _psql_cursor; |
| CLOSE _psql_cursor; |
| COMMIT; |
| |
| -- echo will behave differently on different platforms, force to use bash with -E option |
| CREATE EXTERNAL WEB TABLE table_qry (val TEXT) |
| EXECUTE E'/usr/bin/env bash -c ''echo -E "$GP_QUERY_STRING"''' ON SEGMENT 0 |
| FORMAT 'TEXT' (ESCAPE 'OFF'); |
| SELECT * FROM table_qry WHERE val LIKE '%\\%' ORDER BY val ASC; |
| SELECT * FROM table_qry WHERE val LIKE '%\%' ESCAPE '&' ORDER BY val ASC; |
| -- -------------------------------------- |
| -- some negative tests |
| -- -------------------------------------- |
| -- |
| -- test for exec child process stderr showing in error message |
| -- |
| create external web table ext_stderr1(a text) execute 'nosuchcommand' format 'text'; |
| create external web table ext_stderr2(a text) execute 'cat nosuchfile.txt' format 'text'; |
| select * from ext_stderr1; |
| select * from ext_stderr2; |
| drop external web table ext_stderr1; |
| drop external web table ext_stderr2; |
| -- |
| -- bad csv (quote must be a single char) |
| -- |
| create external table bad_whois ( |
| source_lineno int, |
| domain_name varchar(350) |
| ) |
| location ('gpfdist://@hostname@:7070/exttab1/whois.csv' ) |
| format 'csv' ( header quote as 'ggg'); |
| select count(*) from bad_whois; |
| drop external table bad_whois; |
| -- |
| -- try a bad location |
| -- |
| create external table badt1 (x text) |
| location ('file://@hostname@@abs_srcdir@/data/no/such/place/badt1.tbl' ) |
| format 'text' (delimiter '|'); |
| select * from badt1; |
| drop external table badt1; |
| |
| -- |
| -- try a bad protocol |
| -- |
| create external table badt2 (x text) |
| location ('bad_protocol://@hostname@@abs_srcdir@/data/no/such/place/badt2.tbl' ) |
| format 'text' (delimiter '|'); |
| |
| -- |
| -- ALTER (partial support) |
| -- |
| create external table ext (a int, x text) |
| location ('file://@hostname@@abs_srcdir@/data/no/such/place/badt1.tbl' ) |
| format 'text'; |
| alter table ext drop column a; -- should pass |
| alter external table ext add column a int; -- pass |
| alter external table ext drop column a; -- pass |
| alter external table ext add column extnewcol int not null; -- pass |
| alter external table ext alter column extnewcol set default 1; -- pass |
| |
| alter external table ext alter column x type integer using 123; -- should fail (USING doesn't make sense on external table) |
| alter external table ext alter column x type integer; -- pass |
| |
| -- |
| -- TRUNCATE/UPDATE/DELETE/INSERT (INTO RET) |
| -- |
| truncate ext; |
| delete from ext; |
| update ext set x='1' where x='2'; |
| insert into ext(x) values(123); |
| create index ext_index on ext(x); -- should fail |
| drop table ext; -- should fail (wrong object) |
| drop external table ext; |
| |
| ---------------------------------------------------------------------- |
| -- CUSTOM PROTOCOLS |
| ---------------------------------------------------------------------- |
| DROP EXTERNAL TABLE IF EXISTS ext_w; |
| DROP EXTERNAL TABLE IF EXISTS ext_r; |
| DROP ROLE IF EXISTS extprotu; |
| CREATE OR REPLACE FUNCTION write_to_file() RETURNS integer as '$libdir/gpextprotocol.so', 'demoprot_export' LANGUAGE C STABLE NO SQL; |
| CREATE OR REPLACE FUNCTION read_from_file() RETURNS integer as '$libdir/gpextprotocol.so', 'demoprot_import' LANGUAGE C STABLE NO SQL; |
| |
| DROP PROTOCOL IF EXISTS demoprot; |
| CREATE TRUSTED PROTOCOL demoprot (readfunc = 'nosuchfunc'); -- should fail |
| CREATE TRUSTED PROTOCOL demoprot (readfunc = 'boolin'); -- should fail |
| CREATE TRUSTED PROTOCOL demoprot (readfunc = 'read_from_file', writefunc = 'write_to_file'); -- should succeed |
| CREATE PROTOCOL demoprot_untrusted (readfunc = 'read_from_file', writefunc = 'write_to_file'); -- should succeed |
| ALTER PROTOCOL demoprot_untrusted RENAME TO demoprot_untrusted2; |
| ALTER PROTOCOL demoprot_untrusted2 RENAME TO demoprot_untrusted; |
| CREATE PROTOCOL demoprot_untrusted2 (readfunc = 'read_from_file', writefunc = 'write_to_file'); -- should succeed |
| ALTER PROTOCOL demoprot_untrusted RENAME TO demoprot_untrusted2; -- should failed |
| ALTER PROTOCOL demoprot_untrustedx RENAME TO demoprot_untrusted2; --should failed |
| |
| CREATE ROLE extprotu NOSUPERUSER; |
| SET SESSION AUTHORIZATION extprotu; |
| |
| CREATE WRITABLE EXTERNAL TABLE ext_w(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should fail |
| CREATE READABLE EXTERNAL TABLE ext_r(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should fail |
| |
| RESET SESSION AUTHORIZATION; |
| ALTER PROTOCOL demoprot_untrusted OWNER TO extprotu; -- should fail. protocol is not trusted |
| GRANT SELECT ON PROTOCOL demoprot_untrusted TO extprotu; -- should fail. protocol is not trusted |
| GRANT SELECT ON PROTOCOL demoprot TO extprotu; |
| GRANT INSERT ON PROTOCOL demoprot TO extprotu; |
| \t on |
| -- print with tuples-only mode : suppress diff related to user string length. |
| SELECT ptcname, ptcacl FROM PG_EXTPROTOCOL WHERE ptcname = 'demoprot'; |
| \t off |
| SET SESSION AUTHORIZATION extprotu; |
| |
| CREATE WRITABLE EXTERNAL TABLE ext_w(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should succeed |
| -- For tables using custom protocol should have dependency |
| SELECT count(*) FROM pg_depend WHERE refclassid = 'pg_extprotocol'::regclass and objid = 'ext_w'::regclass; |
| |
| CREATE READABLE EXTERNAL TABLE ext_r(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should succeed |
| -- For tables using custom protocol should have dependency |
| SELECT count(*) FROM pg_depend WHERE refclassid = 'pg_extprotocol'::regclass and objid = 'ext_r'::regclass; |
| |
| DROP EXTERNAL TABLE IF EXISTS ext_w; |
| DROP EXTERNAL TABLE IF EXISTS ext_r; |
| |
| RESET SESSION AUTHORIZATION; |
| REVOKE INSERT ON PROTOCOL demoprot FROM extprotu; |
| SET SESSION AUTHORIZATION extprotu; |
| |
| CREATE WRITABLE EXTERNAL TABLE ext_w(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should fail |
| CREATE READABLE EXTERNAL TABLE ext_r(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should succeed |
| DROP EXTERNAL TABLE ext_r; |
| RESET SESSION AUTHORIZATION; |
| REVOKE ALL PRIVILEGES ON PROTOCOL demoprot FROM extprotu; |
| DROP ROLE IF EXISTS extprotu; |
| |
| -- Test multi-object DROP |
| CREATE PROTOCOL demoprot_droptest1 (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| CREATE PROTOCOL demoprot_droptest2 (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| DROP PROTOCOL demoprot_droptest1, demoprot_droptest2; |
| |
| -- Test non-superuser CREATE PROTOCOL, should fail |
| DROP ROLE IF EXISTS extprot_non_superuser; |
| CREATE ROLE extprot_non_superuser WITH NOSUPERUSER LOGIN CREATEDB; |
| SET ROLE extprot_non_superuser; |
| CREATE PROTOCOL demoprot_non_superuser (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| CREATE TRUSTED PROTOCOL demoprot_non_superuser (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| RESET ROLE; |
| |
| -- Test "DROP OWNED BY" when everything of the protocol is granted to some user. |
| -- GitHub Issue #12748: https://github.com/greenplum-db/gpdb/issues/12748 |
| CREATE TRUSTED PROTOCOL dummy_protocol_issue_12748 (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| CREATE ROLE test_role_issue_12748; |
| GRANT ALL ON PROTOCOL dummy_protocol_issue_12748 TO test_role_issue_12748; |
| DROP OWNED BY test_role_issue_12748; |
| -- Clean up. |
| DROP ROLE test_role_issue_12748; |
| DROP PROTOCOL dummy_protocol_issue_12748; |
| |
| -- Test pg_exttable's encoding: QE's encoding should be consistent with QD |
| -- GitHub Issue #9727: https://github.com/greenplum-db/gpdb/issues/9727 |
| SET client_encoding = 'ISO-8859-1'; |
| CREATE EXTERNAL TABLE issue_9727 (d varchar(20)) location ('gpfdist://9727/d.dat') format 'csv' (DELIMITER '|'); |
| SELECT encoding from pg_exttable where urilocation='{gpfdist://9727:8080/d.dat}'; |
| SELECT encoding from gp_dist_random('pg_exttable') where urilocation='{gpfdist://9727:8080/d.dat}'; |
| DROP FOREIGN TABLE issue_9727; |
| RESET client_encoding; |
| |
| -- Test external table location escape |
| -- GitHub Issue #17179: https://github.com/greenplum-db/gpdb/issues/17179 |
| CREATE READABLE EXTERNAL TABLE public.test_ext |
| ( |
| id integer |
| ) |
| LOCATION( |
| 'file://gpdev/tmp/test1|.|tx||t|||', |
| 'file://gpdev/tmp/test2|.|tx||t||||' |
| ) |
| FORMAT 'TEXT' ( |
| delimiter 'off' null E'\\N' escape E'\\' |
| ) |
| ENCODING 'UTF8' |
| LOG ERRORS PERSISTENTLY SEGMENT REJECT LIMIT 10 PERCENT; |
| SELECT urilocation FROM pg_exttable WHERE reloid = 'public.test_ext'::regclass; |
| DROP EXTERNAL TABLE public.test_ext; |
| -- |
| -- WET tests |
| -- |
| |
| -- |
| -- CREATE (including LIKE, DISTRIBUTED BY) |
| -- |
| -- positive |
| create writable external web table wet_pos4(a text, b text) execute 'some command' format 'text'; |
| |
| -- negative |
| create writable external table wet_neg1(a text, b text) location('file://@hostname@@abs_srcdir@/badt1.tbl') format 'text'; |
| create writable external table wet_neg1(a text, b text) location('gpfdist://foo:7070/wet.out', 'gpfdist://foo:7070/wet.out') format 'text'; |
| create writable external web table wet_pos5(a text, b text) execute 'some command' on segment 0 format 'text'; |
| |
| -- cannot read from a WRITABLE external table. |
| select * from wet_pos4; |
| |
| -- Test selecting the CTID system column on an external table. In the past, |
| -- it was necessary that we generated artificial CTIDs for external table |
| -- scans, because the planner generated plans that used the CTID attribute |
| -- to implement certain semi-joins. Nowadays, we use generated row IDs in |
| -- such plans, and don't need CTID for that purpose anymore. |
| |
| CREATE EXTERNAL TABLE ext_mpp17980 ( id int , id1 int , id2 int) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/mpp17980.data') |
| FORMAT 'CSV' ( DELIMITER ',' NULL ' '); |
| |
| CREATE TABLE mpp17980 (id int, date date, amt decimal(10,2)) |
| DISTRIBUTED randomly PARTITION BY RANGE (date) |
| ( START (date '2008-01-01') INCLUSIVE END (date '2009-01-01') EXCLUSIVE |
| EVERY (INTERVAL '1 month') ); |
| |
| INSERT INTO mpp17980 VALUES ( 1,'2008-02-20',122.11); |
| |
| SELECT COUNT(*) FROM ext_mpp17980 WHERE id IN ( 1 ) ; -- This returns 18 tuples |
| |
| SELECT COUNT(*) FROM ext_mpp17980 WHERE id IN ( SELECT id FROM mpp17980 ) ; -- This should return 18 tuples but returns only 1 |
| |
| SELECT ctid, * FROM ext_mpp17980; |
| |
| DROP EXTERNAL TABLE ext_mpp17980; |
| DROP TABLE mpp17980; |
| |
| COPY (VALUES('1,2'),('1,2,3'),('1,'),('1')) TO '@abs_srcdir@/data/tableless.csv'; |
| CREATE TABLE tableless_heap(a int, b int); |
| COPY tableless_heap FROM '@abs_srcdir@/data/tableless.csv' CSV LOG ERRORS SEGMENT REJECT LIMIT 10; |
| SELECT relname, linenum, errmsg FROM gp_read_error_log('tableless_heap'); |
| create table errlog_save as select * from gp_read_error_log('tableless_heap'); |
| select count(*) from errlog_save; |
| SELECT gp_truncate_error_log('tableless_heap'); |
| SELECT relname, linenum, errmsg FROM gp_read_error_log('tableless_heap'); |
| |
| create external table tableless_ext(a int, b int) |
| location ('file://@hostname@@abs_srcdir@/data/tableless.csv') |
| format 'csv' |
| log errors segment reject limit 10; |
| select * from tableless_ext; |
| SELECT relname, linenum, errmsg FROM gp_read_error_log('tableless_ext'); |
| SELECT (gp_read_error_log('tableless_ext')).errmsg; |
| SELECT gp_truncate_error_log('tableless_ext'); |
| SELECT relname, linenum, errmsg FROM gp_read_error_log('tableless_ext'); |
| select * from tableless_ext; |
| SELECT gp_truncate_error_log('*'); |
| select * from tableless_ext; |
| SELECT gp_truncate_error_log('*.*'); |
| SELECT relname, linenum, errmsg FROM gp_read_error_log('tableless_ext'); |
| |
| |
| -- |
| -- These fail because there are more locations than there are segments. |
| -- |
| -- As written, if you have a large enough cluster, with more than 20 |
| -- segments, this will fail to test what's intended. But we don't currently |
| -- run automated tests like that, and you'll get a different error message, |
| -- so it won't fail silently. |
| -- |
| create external table ret_too_many_uris(a text, b text) location( |
| 'gpfdist://foo.invalid:7070/ret.tbl1', 'gpfdist://foo.invalid:7070/ret.tbl2', |
| 'gpfdist://foo.invalid:7070/ret.tbl3', 'gpfdist://foo.invalid:7070/ret.tbl4', |
| 'gpfdist://foo.invalid:7070/ret.tbl5', 'gpfdist://foo.invalid:7070/ret.tbl6', |
| 'gpfdist://foo.invalid:7070/ret.tbl7', 'gpfdist://foo.invalid:7070/ret.tbl8', |
| 'gpfdist://foo.invalid:7070/ret.tbl9', 'gpfdist://foo.invalid:7070/ret.tbl10', |
| 'gpfdist://foo.invalid:7070/ret.tbl11', 'gpfdist://foo.invalid:7070/ret.tbl12', |
| 'gpfdist://foo.invalid:7070/ret.tbl13', 'gpfdist://foo.invalid:7070/ret.tbl14', |
| 'gpfdist://foo.invalid:7070/ret.tbl15', 'gpfdist://foo.invalid:7070/ret.tbl16', |
| 'gpfdist://foo.invalid:7070/ret.tbl17', 'gpfdist://foo.invalid:7070/ret.tbl18', |
| 'gpfdist://foo.invalid:7070/ret.tbl19', 'gpfdist://foo.invalid:7070/ret.tbl20' |
| ) format 'text'; |
| \d ret_too_many_uris |
| select * from ret_too_many_uris; |
| |
| create writable external table wet_too_many_uris(a text, b text) location( |
| 'gpfdist://foo.invalid:7070/wet.out1', 'gpfdist://foo.invalid:7070/wet.out2', |
| 'gpfdist://foo.invalid:7070/wet.out3', 'gpfdist://foo.invalid:7070/wet.out4', |
| 'gpfdist://foo.invalid:7070/wet.out5', 'gpfdist://foo.invalid:7070/wet.out6', |
| 'gpfdist://foo.invalid:7070/wet.out7', 'gpfdist://foo.invalid:7070/wet.out8', |
| 'gpfdist://foo.invalid:7070/wet.out9', 'gpfdist://foo.invalid:7070/wet.out10', |
| 'gpfdist://foo.invalid:7070/wet.out11', 'gpfdist://foo.invalid:7070/wet.out12', |
| 'gpfdist://foo.invalid:7070/wet.out13', 'gpfdist://foo.invalid:7070/wet.out14', |
| 'gpfdist://foo.invalid:7070/wet.out15', 'gpfdist://foo.invalid:7070/wet.out16', |
| 'gpfdist://foo.invalid:7070/wet.out17', 'gpfdist://foo.invalid:7070/wet.out18', |
| 'gpfdist://foo.invalid:7070/wet.out19', 'gpfdist://foo.invalid:7070/wet.out20' |
| ) format 'text'; |
| insert into wet_too_many_uris values ('foo', 'bar'); |
| |
| |
| -- Test for error log functionality |
| |
| -- Scan with no errors |
| CREATE EXTERNAL TABLE exttab_basic_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- Empty error log |
| SELECT * FROM gp_read_error_log('exttab_basic_1'); |
| SELECT COUNT(*) FROM exttab_basic_1; |
| -- Error log should still be empty |
| SELECT * FROM gp_read_error_log('exttab_basic_1'); |
| |
| -- test ON COORDINATOR without LOG ERRORS, return empty results for all rows error out |
| CREATE EXTERNAL WEB TABLE exttab_basic_error_1( i int ) |
| EXECUTE E'cat @abs_srcdir@/data/exttab.data' ON COORDINATOR |
| FORMAT 'TEXT' (DELIMITER '|') |
| SEGMENT REJECT LIMIT 20; |
| SELECT * FROM exttab_basic_error_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_basic_error_1; |
| |
| -- test ON MASTER still works (this syntax will be removed in GPDB8 and forward) |
| CREATE EXTERNAL WEB TABLE exttab_basic_error_1( i int ) |
| EXECUTE E'cat @abs_srcdir@/data/exttab.data' ON MASTER |
| FORMAT 'TEXT' (DELIMITER '|') |
| SEGMENT REJECT LIMIT 20; |
| SELECT * FROM exttab_basic_error_1; |
| |
| -- Some errors without exceeding reject limit |
| CREATE EXTERNAL TABLE exttab_basic_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- should not error out as segment reject limit will not be reached |
| SELECT * FROM exttab_basic_2 order by i; |
| -- Error rows logged |
| select count(*) from gp_read_error_log('exttab_basic_2'); |
| |
| -- Errors with exceeding reject limit |
| CREATE EXTERNAL TABLE exttab_basic_3( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- should error out as segment reject limit will be reached |
| SELECT * FROM exttab_basic_3; |
| -- Error log should be populated |
| select count(*) > 0 from gp_read_error_log('exttab_basic_3'); |
| |
| -- Insert into another table |
| CREATE EXTERNAL TABLE exttab_basic_4( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 100; |
| CREATE TABLE exttab_insert_1 (LIKE exttab_basic_4); |
| -- Insert should go through fine |
| INSERT INTO exttab_insert_1 SELECT * FROM exttab_basic_4; |
| -- Error log should be populated |
| select count(*) > 0 from gp_read_error_log('exttab_basic_4'); |
| -- Use the same error log above |
| CREATE EXTERNAL TABLE exttab_basic_5( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 5; |
| -- Insert should fail |
| INSERT INTO exttab_insert_1 select * from exttab_basic_5; |
| SELECT * from exttab_insert_1 order by i; |
| -- Error log should have additional rows that were rejected by the above query |
| SELECT count(*) from gp_read_error_log('exttab_basic_5'); |
| |
| -- CTAS |
| CREATE EXTERNAL TABLE exttab_basic_6( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 100; |
| CREATE TABLE exttab_ctas_1 as SELECT * FROM exttab_basic_6; |
| -- CTAS should go through fine |
| SELECT * FROM exttab_ctas_1 order by i; |
| -- Error log should have six rows that were rejected |
| select count(*) from gp_read_error_log('exttab_basic_6'); |
| CREATE EXTERNAL TABLE exttab_basic_7( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 5; |
| -- CTAS should fail |
| CREATE TABLE exttab_ctas_2 AS select * from exttab_basic_7; |
| -- Table should not exist |
| SELECT * from exttab_ctas_2 order by i; |
| -- Error table should have additional rows that were rejected by the above query |
| SELECT count(*) from gp_read_error_log('exttab_basic_7'); |
| -- Drop external table gets rid off error logs |
| DROP EXTERNAL TABLE IF EXISTS exttab_error_log; |
| CREATE EXTERNAL TABLE exttab_error_log( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| SELECT COUNT(*) FROM exttab_error_log; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_error_log'); |
| DROP EXTERNAL TABLE exttab_error_log; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_error_log'); |
| |
| -- Insert into another table with unique constraints |
| CREATE EXTERNAL TABLE exttab_constraints_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- Should not error out |
| SELECT COUNT(*) FROM exttab_constraints_1; |
| -- Error log should have a couple of rows |
| SELECT COUNT(*) from gp_read_error_log('exttab_constraints_1'); |
| CREATE TABLE exttab_constraints_insert_1 (LIKE exttab_constraints_1) distributed by (i); |
| ALTER TABLE exttab_constraints_insert_1 SET DISTRIBUTED BY(j); |
| ALTER TABLE exttab_constraints_insert_1 ADD CONSTRAINT exttab_uniq_constraint_1 UNIQUE (j); |
| -- This should fail |
| select gp_truncate_error_log('exttab_constraints_1'); |
| INSERT INTO exttab_constraints_insert_1 SELECT * FROM exttab_constraints_1; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_constraints_1'); |
| |
| -- CTE with segment reject limit reached |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_cte_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_cte_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| with cte1 as |
| ( |
| SELECT e1.i, e2.j FROM exttab_cte_2 e1, exttab_cte_1 e2 |
| WHERE e1.i = e2.i ORDER BY e1.i |
| ) |
| SELECT * FROM cte1 ORDER BY cte1.i; |
| select count(*) from gp_read_error_log('exttab_cte_2'); |
| -- start_ignore |
| select gp_read_error_log('exttab_cte_2'); |
| -- end_ignore |
| |
| -- CTE without segment reject limit exceeded |
| select gp_truncate_error_log('exttab_cte_1'); |
| select gp_truncate_error_log('exttab_cte_2'); |
| with cte1 as |
| ( |
| SELECT e1.i, e2.j FROM exttab_cte_1 e1, exttab_cte_1 e2 WHERE e1.i = e2.i AND e1.i > 5 ORDER BY e1.i |
| ) |
| SELECT cte1.i , cte1.j FROM cte1 ORDER BY cte1.i; |
| |
| -- Check permissions with gp_truncate_error_log and gp_read_error_log |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_permissions_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit |
| CREATE EXTERNAL TABLE exttab_permissions_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- generate some error logs |
| SELECT COUNT(*) FROM exttab_permissions_1; |
| SELECT COUNT(*) FROM exttab_permissions_2; |
| |
| -- Only superuser can do gp_truncate_error_log('*.*') |
| DROP ROLE IF EXISTS exttab_non_superuser; |
| CREATE ROLE exttab_non_superuser WITH NOSUPERUSER LOGIN CREATEDB; |
| SET ROLE exttab_non_superuser; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_1'); |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_2'); |
| SELECT gp_truncate_error_log('exttab_permissions_1'); |
| SELECT gp_truncate_error_log('exttab_permissions_2'); |
| SELECT gp_truncate_error_log('*'); |
| SELECT gp_truncate_error_log('*.*'); |
| RESET ROLE; |
| DROP ROLE IF EXISTS exttab_superuser; |
| CREATE ROLE exttab_superuser WITH SUPERUSER LOGIN; |
| SET ROLE exttab_superuser; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_2'); |
| SELECT gp_truncate_error_log('*'); |
| SELECT gp_truncate_error_log('*.*'); |
| SELECT gp_truncate_error_log('exttab_permissions_1'); |
| SELECT gp_truncate_error_log('exttab_permissions_2'); |
| RESET ROLE; |
| SELECT * FROM gp_read_error_log('exttab_permissions_1'); |
| SELECT * FROM gp_read_error_log('exttab_permissions_2'); |
| |
| -- Only database owner can do gp_truncate_error_log('*') |
| DROP DATABASE IF EXISTS exttab_db; |
| DROP ROLE IF EXISTS exttab_user1; |
| DROP ROLE IF EXISTS exttab_user2; |
| CREATE ROLE exttab_user1 WITH NOSUPERUSER LOGIN; |
| CREATE ROLE exttab_user2 WITH NOSUPERUSER LOGIN; |
| CREATE DATABASE exttab_db WITH OWNER=exttab_user1; |
| \c exttab_db |
| -- generate some error logs in this db |
| CREATE EXTERNAL TABLE exttab_permissions_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| SELECT COUNT(*) FROM exttab_permissions_1 e1, exttab_permissions_1 e2; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_1'); |
| SET ROLE exttab_user2; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_1'); |
| SELECT gp_truncate_error_log('*'); |
| SELECT gp_truncate_error_log('*.*'); |
| SELECT gp_truncate_error_log('exttab_permissions_1'); |
| SET ROLE exttab_user1; |
| -- Database owner can still not perform read / truncate on specific tables. This follows the same mechanism as TRUNCATE table. |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_1'); |
| SELECT gp_truncate_error_log('exttab_permissions_1'); |
| SELECT gp_truncate_error_log('*'); |
| -- should fail |
| SELECT gp_truncate_error_log('*.*'); |
| RESET ROLE; |
| SELECT * FROM gp_read_error_log('exttab_permissions_1'); |
| \c regression |
| DROP ROLE IF EXISTS errlog_exttab_user3; |
| DROP ROLE IF EXISTS errlog_exttab_user4; |
| CREATE ROLE errlog_exttab_user3 WITH NOSUPERUSER LOGIN; |
| CREATE ROLE errlog_exttab_user4 WITH NOSUPERUSER LOGIN; |
| -- generate some error logs in this db |
| CREATE EXTERNAL TABLE exttab_permissions_3( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| SELECT COUNT(*) FROM exttab_permissions_3 e1, exttab_permissions_3 e2; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_3'); |
| ALTER EXTERNAL TABLE exttab_permissions_3 OWNER TO errlog_exttab_user3; |
| -- This should fail with non table owner |
| SET ROLE errlog_exttab_user4; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_3'); |
| SELECT gp_truncate_error_log('exttab_permissions_3'); |
| -- should go through fine with table owner |
| SET ROLE errlog_exttab_user3; |
| SELECT gp_truncate_error_log('exttab_permissions_3'); |
| RESET ROLE; |
| SELECT * FROM gp_read_error_log('exttab_permissions_3'); |
| |
| -- Grant TRUNCATE permission on table to a non table owner and make sure he is able to do gp_truncate_error_log |
| GRANT TRUNCATE on exttab_permissions_3 to errlog_exttab_user4; |
| SELECT COUNT(*) FROM exttab_permissions_3 e1, exttab_permissions_3 e2; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_permissions_3'); |
| SET ROLE errlog_exttab_user4; |
| SELECT gp_truncate_error_log('exttab_permissions_3'); |
| RESET ROLE; |
| SELECT * FROM gp_read_error_log('exttab_permissions_3'); |
| |
| -- Subqueries reaching segment reject limit |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_subq_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_subq_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| SELECT sum(distinct e1.i), sum(distinct e2.i), e1.j FROM |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subq_2 WHERE i < 10) e2 |
| group by e1.j; |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subq_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subq_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT sum(distinct e1.i), sum(distinct e2.i), e1.j FROM |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 10) e2 |
| group by e1.j |
| HAVING sum(distinct e1.i) > (SELECT max(i) FROM exttab_subq_2); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subq_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subq_2') |
| ) FOO; |
| |
| -- Subqueries without reaching segment reject limit |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT sum(distinct e1.i), sum(distinct e2.i), e1.j FROM |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 10) e2 |
| group by e1.j order by 3,2,1; |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT sum(distinct e1.i), sum(distinct e2.i), e1.j FROM |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subq_1 WHERE i < 10) e2 |
| group by e1.j |
| HAVING sum(distinct e1.i) > (SELECT max(i) FROM exttab_subq_1); |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT e1.i , e1.j FROM |
| exttab_subq_1 e1, exttab_subq_1 e2 |
| WHERE e1.j = e2.j and |
| e1.i + 1 IN ( SELECT i from exttab_subq_1 WHERE i <= e1.i); |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT ( SELECT i FROM exttab_subq_2 WHERE i <= e1.i) as i, e1.j |
| FROM exttab_subq_2 e1, exttab_subq_1 e2 |
| WHERE e1.i = e2.i; |
| |
| -- CSQ |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT e1.i , e1.j FROM |
| exttab_subq_1 e1, exttab_subq_1 e2 |
| WHERE e1.j = e2.j and |
| e1.i + 1 IN ( SELECT i from exttab_subq_2 WHERE i <= e1.i); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subq_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subq_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_subq_1'); |
| SELECT gp_truncate_error_log('exttab_subq_2'); |
| SELECT ( SELECT i FROM exttab_subq_2 WHERE i <= e1.i) as i, e1.j |
| FROM exttab_subq_2 e1, exttab_subq_1 e2 |
| WHERE e1.i = e2.i; |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subq_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subq_2') |
| ) FOO; |
| |
| -- TRUNCATE / delete / write to error logs within subtransactions |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_subtxs_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_subtxs_2( i int, j text ) |
| LOCATION ('file://@hostname@:@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- Populate error logs before transaction |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| SELECT COUNT(*) |
| FROM ( |
| SELECT * FROM gp_read_error_log('exttab_subtxs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subtxs_2') |
| ) FOO; |
| BEGIN; |
| savepoint s1; |
| SELECT gp_truncate_error_log('exttab_subtxs_1'); |
| SELECT gp_truncate_error_log('exttab_subtxs_2'); |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| -- should have written rows into error log |
| SELECT count(*) FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subtxs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subtxs_2') |
| ) FOO; |
| savepoint s2; |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| savepoint s3; |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subtxs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| ROLLBACK TO s2; |
| -- rollback should not rollback the error rows written from within the transaction |
| SELECT count(*) FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subtxs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subtxs_2') |
| ) FOO; |
| -- Make the tx fail, segment reject limit reaches here |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_subtxs_2 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_subtxs_2 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| COMMIT; |
| -- Error logs should not have been rolled back. |
| -- Check that number of errors is greater than 12 instead of checking for |
| -- actual number of errors, since the transaction might get aborted even before |
| -- rows are scanned on other segments if one of the segments hits the segment |
| -- reject limit. The 12 errors are from previous scans of the external table. |
| SELECT count(*) > 12 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_subtxs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_subtxs_2') |
| ) FOO; |
| |
| -- TRUNCATE error logs within tx , abort transaction |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_txs_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_txs_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- Populate error log before transaction |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| SELECT count(*) FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_txs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_txs_2') |
| ) FOO; |
| BEGIN; |
| SELECT gp_truncate_error_log('exttab_txs_1'); |
| SELECT gp_truncate_error_log('exttab_txs_2'); |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| ABORT; |
| -- Check that number of errors is greater than zero instead of checking the |
| -- actual number of errors since the transaction might get aborted even before |
| -- rows are scanned on other segments if one of the segments hits the segment |
| -- reject limit. |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_txs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_txs_2') |
| ) FOO; |
| |
| -- TRUNCATE error logs within txs , with segment reject limit reached |
| -- Populate error log before transaction |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| SELECT count(*) FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_txs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_txs_2') |
| ) FOO; |
| BEGIN; |
| SELECT gp_truncate_error_log('exttab_txs_1'); |
| SELECT gp_truncate_error_log('exttab_txs_2'); |
| -- This should abort the transaction |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_2 WHERE i < 10) e2 |
| WHERE e1.i = e2.i; |
| COMMIT; |
| -- Additional error rows should have been inserted into the error logs even if the tx is aborted. |
| -- Truncate of error logs should not be rolled back even if the transaction is aborted. All operation on error logs are persisted. |
| -- Check that number of errors is greater than zero instead of checking for |
| -- actual number of errors, since the transaction might get aborted even before |
| -- rows are scanned on other segments if one of the segments hits the segment |
| -- reject limit. |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_txs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_txs_2') |
| ) FOO; |
| |
| -- Creating external table with error log within txs with segment reject limits reached |
| SELECT gp_truncate_error_log('exttab_txs_1'); |
| SELECT gp_truncate_error_log('exttab_txs_2'); |
| DROP EXTERNAL TABLE IF EXISTS exttab_txs_3; |
| DROP EXTERNAL TABLE IF EXISTS exttab_txs_4; |
| BEGIN; |
| -- create an external table that will reach segment reject limit |
| -- reaches reject limit |
| CREATE EXTERNAL TABLE exttab_txs_3( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- new error log, within segment reject limit |
| CREATE EXTERNAL TABLE exttab_txs_4( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_4 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_4 WHERE i < 10) e2 |
| WHERE e1.i = e2.i order by e1.i; |
| -- should be populated correctly |
| SELECT count(*) FROM gp_read_error_log('exttab_txs_4'); |
| -- should error out and abort the transaction |
| SELECT e1.i, e2.j FROM |
| (SELECT i, j FROM exttab_txs_3 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_txs_4 WHERE i < 10) e2 |
| WHERE e1.i = e2.i order by e1.i; |
| COMMIT; |
| -- Error logs should not exist for these tables that would have been rolled back |
| SELECT count(*) FROM gp_read_error_log('exttab_txs_3'); |
| SELECT count(*) FROM gp_read_error_log('exttab_txs_4'); |
| -- external tables created within aborted transactions should not exist |
| SELECT count(*) FROM exttab_txs_3; |
| SELECT count(*) FROM exttab_txs_4; |
| |
| -- UDFS with segment reject limit reached |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_udfs_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_udfs_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| CREATE OR REPLACE FUNCTION exttab_udfs_func1 () |
| RETURNS boolean |
| AS $$ |
| BEGIN |
| EXECUTE 'SELECT sum(distinct e1.i) as sum_i, sum(distinct e2.i) as sum_j, e1.j as j FROM |
| (SELECT i, j FROM exttab_udfs_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_udfs_2 WHERE i < 10) e2 |
| group by e1.j'; |
| RETURN 1; |
| END; |
| $$ |
| LANGUAGE plpgsql volatile; |
| -- Should fail |
| SELECT * FROM exttab_udfs_func1(); |
| -- Should be populated |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| |
| -- INSERT INTO from a udf |
| DROP TABLE IF EXISTS exttab_udfs_insert_1; |
| CREATE TABLE exttab_udfs_insert_1(a boolean); |
| SELECT gp_truncate_error_log('exttab_udfs_1'); |
| SELECT gp_truncate_error_log('exttab_udfs_2'); |
| -- Should fail |
| INSERT INTO exttab_udfs_insert_1 SELECT * FROM exttab_udfs_func1(); |
| SELECT * FROM exttab_udfs_insert_1; |
| -- Error table should be populated correctly |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| |
| -- UDFs with INSERT INTO with segment reject limit reached |
| DROP TABLE IF EXISTS exttab_udfs_insert_2; |
| CREATE TABLE exttab_udfs_insert_2 (LIKE exttab_udfs_1); |
| CREATE OR REPLACE FUNCTION exttab_udfs_func2 () |
| RETURNS boolean |
| AS $$ |
| DECLARE |
| r RECORD; |
| cnt integer; |
| result boolean; |
| BEGIN |
| SELECT INTO result gp_truncate_error_log('exttab_udfs_1'); |
| SELECT INTO result gp_truncate_error_log('exttab_udfs_2'); |
| INSERT INTO exttab_udfs_insert_2 |
| SELECT i, j from exttab_udfs_1; |
| cnt := 0; |
| FOR r in SELECT * FROM gp_read_error_log('exttab_udfs_1') LOOP |
| -- just looping through the error log |
| cnt := cnt + 1; |
| END LOOP; |
| IF cnt <= 0 THEN |
| RAISE EXCEPTION 'Error log should not be empty'; |
| END IF; |
| SELECT count(*) INTO cnt FROM exttab_udfs_insert_2; |
| -- should be 8 |
| IF cnt <> 8 THEN |
| RAISE EXCEPTION 'Unexpected number of rows inserted'; |
| END IF; |
| -- Now make insert into fail |
| INSERT INTO exttab_udfs_insert_2 |
| SELECT i, j from exttab_udfs_2; |
| -- Should not reach here |
| cnt := 0; |
| FOR r in SELECT * FROM gp_read_error_log('exttab_udfs_2') LOOP |
| -- just looping through the error log |
| cnt := cnt + 1; |
| END LOOP; |
| IF cnt <= 0 THEN |
| RAISE EXCEPTION 'Error table should not be empty'; |
| END IF; |
| RETURN 1; |
| END; |
| $$ |
| LANGUAGE plpgsql volatile; |
| SELECT gp_truncate_error_log('exttab_udfs_1'); |
| SELECT gp_truncate_error_log('exttab_udfs_2'); |
| -- All this should fail, error logs should be populated even if the UDF gets aborted as we persist error rows written within aborted txs. |
| SELECT * FROM exttab_udfs_func2(); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_udfs_1'); |
| SELECT gp_truncate_error_log('exttab_udfs_2'); |
| SELECT exttab_udfs_func2(); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_udfs_1'); |
| SELECT gp_truncate_error_log('exttab_udfs_2'); |
| INSERT INTO exttab_udfs_insert_1 SELECT * FROM exttab_udfs_func2(); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_udfs_1'); |
| SELECT gp_truncate_error_log('exttab_udfs_2'); |
| CREATE TABLE exttab_udfs_ctas_2 AS SELECT * FROM exttab_udfs_func2(); |
| SELECT COUNT(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_udfs_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_udfs_2') |
| ) FOO; |
| -- No rows should be inserted into exttab_udfs_insert_2 |
| SELECT * FROM exttab_udfs_insert_2; |
| |
| -- Scans in union queries with seg reject limit reached |
| -- does not reach reject limit |
| DROP EXTERNAL TABLE IF EXISTS exttab_union_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_union_2; |
| CREATE EXTERNAL TABLE exttab_union_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit |
| CREATE EXTERNAL TABLE exttab_union_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| |
| -- Should error out as exttab_union_2 would reach it's reject limit |
| SELECT * FROM |
| ( |
| SELECT * FROM exttab_union_1 |
| UNION |
| SELECT * FROM exttab_union_2 |
| ) FOO |
| order by FOO.i; |
| |
| -- Error table count |
| select count(*) > 0 from |
| ( |
| SELECT * FROM gp_read_error_log('exttab_union_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_union_2') |
| ) FOO; |
| |
| -- Insert into another table, with and without segment reject limits being reached |
| DROP TABLE IF EXISTS exttab_union_insert_1; |
| CREATE TABLE exttab_union_insert_1 (LIKE exttab_union_1); |
| SELECT gp_truncate_error_log('exttab_union_1'); |
| SELECT gp_truncate_error_log('exttab_union_2'); |
| insert into exttab_union_insert_1 |
| SELECT e1.i, e2.j from exttab_union_2 e1 INNER JOIN exttab_union_2 e2 ON e1.i = e2.i |
| UNION ALL |
| SELECT e1.i, e2.j from exttab_union_2 e1 INNER JOIN exttab_union_2 e2 ON e1.i = e2.i; |
| -- should return 0 rows |
| SELECT * from exttab_union_insert_1; |
| -- Error table count, should have more than 0 rows, the total number is non-deterministic |
| select count(*) > 0 from |
| ( |
| SELECT * FROM gp_read_error_log('exttab_union_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_union_2') |
| ) FOO; |
| SELECT gp_truncate_error_log('exttab_union_1'); |
| SELECT gp_truncate_error_log('exttab_union_2'); |
| -- should not error out as exttab_union_1 will not reach segment reject limit |
| insert into exttab_union_insert_1 |
| SELECT e1.i, e2.j from exttab_union_1 e1 INNER JOIN exttab_union_1 e2 ON e1.i = e2.i |
| UNION |
| SELECT e1.i, e2.j from exttab_union_1 e1 INNER JOIN exttab_union_1 e2 ON e1.i = e2.i; |
| -- should return the right result |
| SELECT * from exttab_union_insert_1 order by i; |
| |
| -- Views reaching segment reject limit |
| DROP EXTERNAL TABLE IF EXISTS exttab_views_1 CASCADE; |
| DROP EXTERNAL TABLE IF EXISTS exttab_views_2 CASCADE; |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_views_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_views_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| DROP VIEW IF EXISTS exttab_views_3; |
| CREATE VIEW exttab_views_3 as |
| SELECT sum(distinct e1.i) as sum_i, sum(distinct e2.i) as sum_j, e1.j as j FROM |
| (SELECT i, j FROM exttab_views_1 WHERE i < 5 ) e1, |
| (SELECT i, j FROM exttab_views_2 WHERE i < 10) e2 |
| group by e1.j; |
| SELECT gp_truncate_error_log('exttab_views_1'); |
| SELECT gp_truncate_error_log('exttab_views_2'); |
| -- This should error out |
| SELECT * FROM exttab_views_3; |
| -- Error table should be populated |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_views_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_views_2') |
| ) FOO; |
| |
| -- INSERT INTO FROM a view |
| DROP TABLE IF EXISTS exttab_views_insert_1; |
| CREATE TABLE exttab_views_insert_1 (i int, j int, k text); |
| SELECT gp_truncate_error_log('exttab_views_1'); |
| SELECT gp_truncate_error_log('exttab_views_2'); |
| -- Should fail |
| INSERT INTO exttab_views_insert_1 SELECT * FROM exttab_views_3; |
| -- should not have any rows |
| SELECT * FROM exttab_views_insert_1; |
| -- Error table should be populated |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_views_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_views_2') |
| ) FOO; |
| |
| -- CTAS from a view with segment reject limit reached |
| DROP TABLE IF EXISTS exttab_views_ctas_1; |
| SELECT gp_truncate_error_log('exttab_views_1'); |
| SELECT gp_truncate_error_log('exttab_views_2'); |
| -- Should fail |
| CREATE TABLE exttab_views_ctas_1 AS SELECT * FROM exttab_views_3 where length(j) < 100; |
| SELECT * FROM exttab_views_ctas_1; |
| -- Error table should be populated |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_views_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_views_2') |
| ) FOO; |
| |
| -- CTAS FROM view with segment reject limits reached |
| DROP TABLE IF EXISTS exttab_views_ctas_1; |
| SELECT gp_truncate_error_log('exttab_views_1'); |
| SELECT gp_truncate_error_log('exttab_views_2'); |
| -- Should fail here |
| CREATE TABLE exttab_views_ctas_1 AS SELECT * FROM exttab_views_3; |
| -- Relation should not exist |
| SELECT * FROM exttab_views_ctas_1; |
| -- Error table should be populated |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_views_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_views_2') |
| ) FOO; |
| |
| -- Scans in window queries with and without seg reject limit reached |
| DROP EXTERNAL TABLE IF EXISTS exttab_windows_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_windows_2; |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_windows_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit |
| CREATE EXTERNAL TABLE exttab_windows_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| -- without reaching segment reject limit |
| with cte1 as( |
| select t1.i as i, |
| sum(t2.i) sum_i, |
| avg(sum(t2.i)) over |
| (partition by t2.j) |
| avg_j, |
| rank() over |
| (partition by t2.j order by t1.j) rnk_j |
| from exttab_windows_1 t1, exttab_windows_1 t2 |
| where t1.i = t2.i |
| group by t1.i,t2.j,t1.j |
| ), |
| cte2 as |
| ( |
| select t1.i as i, |
| sum(t2.i) sum_i, |
| avg(sum(t2.i)) over |
| (partition by t2.j) |
| avg_j, |
| rank() over |
| (partition by t2.j order by t1.j) rnk_j |
| from exttab_windows_1 t1, exttab_windows_1 t2 |
| where t1.i = t2.i |
| group by t1.i, t2.j, t1.j |
| ) |
| SELECT * FROM cte1 c1, cte2 c2 |
| WHERE c1.i = c2.i |
| ORDER BY c1.i |
| limit 5; |
| |
| -- with reaching segment reject limit |
| SELECT gp_truncate_error_log('exttab_windows_1'); |
| SELECT gp_truncate_error_log('exttab_windows_2'); |
| with cte1 as( |
| select t1.i as i, |
| sum(t2.i) sum_i, |
| avg(sum(t2.i)) over |
| (partition by t2.j) |
| avg_j, |
| rank() over |
| (partition by t2.j order by t1.j) rnk_j |
| from exttab_windows_1 t1, exttab_windows_2 t2 |
| where t1.i = t2.i |
| group by t1.i,t2.j,t1.j |
| ), |
| cte2 as |
| ( |
| select t1.i as i, |
| sum(t2.i) sum_i, |
| avg(sum(t2.i)) over |
| (partition by t2.j) |
| avg_j, |
| rank() over |
| (partition by t2.j order by t1.j) rnk_j |
| from exttab_windows_1 t1, exttab_windows_2 t2 |
| where t1.i = t2.i |
| group by t1.i, t2.j, t1.j |
| ) |
| SELECT * FROM cte1 c1, cte2 c2 |
| WHERE c1.i = c2.i |
| ORDER BY c1.i |
| limit 5; |
| SELECT COUNT(*) > 0 |
| FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_windows_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_windows_2') |
| ) FOO; |
| |
| -- LIMIT queries without segment reject limit reached |
| DROP EXTERNAL TABLE IF EXISTS exttab_limit_1 cascade; |
| DROP EXTERNAL TABLE IF EXISTS exttab_limit_2 cascade; |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_limit_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| -- reaches reject limit, use the same err table |
| CREATE EXTERNAL TABLE exttab_limit_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 2; |
| |
| -- Note that even though we use exttab_limit_2 here , the LIMIT 3 will not throw a segment reject limit error |
| with cte1 as |
| ( |
| SELECT e1.i, e2.j FROM exttab_limit_1 e1, exttab_limit_1 e2 |
| WHERE e1.i = e2.i LIMIT 5 |
| ) |
| SELECT * FROM cte1, exttab_limit_2 e3 where cte1.i = e3.i ORDER BY cte1.i LIMIT 3; |
| SELECT count(*) FROM gp_read_error_log('exttab_limit_2'); |
| SELECT gp_truncate_error_log('exttab_limit_1'); |
| SELECT gp_truncate_error_log('exttab_limit_2'); |
| -- Note that even though we use exttab_limit_2 here , the LIMIT 3 will not throw a segment reject limit error |
| SELECT * FROM |
| ( |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 5) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 3) |
| ) FOO |
| ORDER BY i LIMIT 5; |
| SELECT COUNT(*) > 0 FROM gp_read_error_log('exttab_limit_2'); |
| |
| -- LIMIT queries with segment reject limit reached |
| SELECT gp_truncate_error_log('exttab_limit_1'); |
| SELECT gp_truncate_error_log('exttab_limit_2'); |
| with cte1 as |
| ( |
| SELECT e1.i, e2.j FROM exttab_limit_1 e1, exttab_limit_1 e2 |
| WHERE e1.i = e2.i LIMIT 3 |
| ) |
| SELECT * FROM cte1, exttab_limit_2 e3 where cte1.i = e3.i ORDER BY cte1.i LIMIT 5; |
| SELECT count(*) > 0 FROM gp_read_error_log('exttab_limit_2'); |
| SELECT gp_truncate_error_log('exttab_limit_1'); |
| SELECT gp_truncate_error_log('exttab_limit_2'); |
| SELECT * FROM |
| ( |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_1 LIMIT 3) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 5) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 5) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 5) |
| UNION |
| (SELECT * FROM exttab_limit_2 LIMIT 5) |
| ) FOO |
| ORDER BY i LIMIT 5; |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_limit_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_limit_2') |
| ) FOO; |
| -- This query will materialize exttab_limit_2 completely even if LIMIT is just 3 and hence will throw segment reject limit reached |
| SELECT gp_truncate_error_log('exttab_limit_1'); |
| SELECT gp_truncate_error_log('exttab_limit_2'); |
| SELECT * FROM exttab_limit_1 e1, exttab_limit_2 e2 where e1.i = e2.i LIMIT 3; |
| SELECT count(*) > 0 FROM |
| ( |
| SELECT * FROM gp_read_error_log('exttab_limit_1') |
| UNION ALL |
| SELECT * FROM gp_read_error_log('exttab_limit_2') |
| ) FOO; |
| |
| -- 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. |
| |
| -- default should be 1000 |
| SHOW gp_initial_bad_row_limit; |
| DROP EXTERNAL TABLE IF EXISTS exttab_first_reject_limit_1 cascade; |
| CREATE EXTERNAL TABLE exttab_first_reject_limit_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_first_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 20000; |
| -- should fail with an appropriate error message |
| SELECT COUNT(*) FROM exttab_first_reject_limit_1; |
| SELECT COUNT(*) > 0 FROM gp_read_error_log('exttab_first_reject_limit_1'); |
| -- should work now |
| SET gp_initial_bad_row_limit = 6000; |
| SELECT gp_truncate_error_log('exttab_first_reject_limit_1'); |
| SELECT COUNT(*) FROM exttab_first_reject_limit_1; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_first_reject_limit_1'); |
| -- first segment reject limit should be checked before segment reject limit |
| DROP EXTERNAL TABLE IF EXISTS exttab_first_reject_limit_2; |
| CREATE EXTERNAL TABLE exttab_first_reject_limit_2( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_first_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 500; |
| -- should report an error saying first rows were rejected |
| SET gp_initial_bad_row_limit = 2; |
| SELECT COUNT(*) FROM exttab_first_reject_limit_2; |
| SELECT COUNT(*) > 0 from gp_read_error_log('exttab_first_reject_limit_2'); |
| -- should report an error saying segment reject limit reached |
| set gp_initial_bad_row_limit = 600; |
| SELECT gp_truncate_error_log('exttab_first_reject_limit_2'); |
| SELECT COUNT(*) FROM exttab_first_reject_limit_2; |
| SELECT COUNT(*) > 0 from gp_read_error_log('exttab_first_reject_limit_2'); |
| -- set unlimited first error rows, should fail only because of segment reject limits |
| set gp_initial_bad_row_limit = 0; |
| SELECT gp_truncate_error_log('exttab_first_reject_limit_2'); |
| SELECT COUNT(*) FROM exttab_first_reject_limit_2; |
| SELECT COUNT(*) > 0 from gp_read_error_log('exttab_first_reject_limit_2'); |
| |
| DROP EXTERNAL TABLE IF EXISTS exttab_heap_join_1; |
| -- does not reach reject limit |
| CREATE EXTERNAL TABLE exttab_heap_join_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| LOG ERRORS SEGMENT REJECT LIMIT 10; |
| DROP TABLE IF EXISTS test_ext_heap_join; |
| CREATE TABLE test_ext_heap_join( i int, j text); |
| -- Turn off stats |
| SET gp_autostats_mode = 'NONE'; |
| INSERT INTO test_ext_heap_join SELECT i, i || '_number' FROM generate_series(1, 10) i; |
| SELECT COUNT(*) FROM test_ext_heap_join, exttab_heap_join_1; |
| SELECT COUNT(*) FROM gp_read_error_log('exttab_heap_join_1'); |
| |
| \! rm @abs_srcdir@/data/tableless.csv |
| |
| -- start_ignore |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator; |
| -- end_ignore |
| |
| -- Create external table with on clause |
| CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON COORDINATOR FORMAT 'TEXT' (DELIMITER '|'); |
| |
| SELECT * FROM exttab_with_on_coordinator; |
| |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator; |
| |
| -- start_ignore |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty; |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_option_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_options; |
| -- end_ignore |
| |
| -- Create external table with 'OPTIONS' |
| CREATE EXTERNAL TABLE exttab_with_option_empty( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| OPTIONS (); |
| |
| CREATE EXTERNAL TABLE exttab_with_option_1( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| OPTIONS (hello 'world'); |
| |
| CREATE EXTERNAL TABLE exttab_with_options( i int, j text ) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') |
| OPTIONS (hello 'world', bonjour 'again', nihao 'again and again' ); |
| |
| \d exttab_with_options |
| |
| \d exttab_with_option_empty |
| |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty; |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_option_1; |
| DROP EXTERNAL TABLE IF EXISTS exttab_with_options; |
| |
| -- start_ignore |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv3; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv4; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv5; |
| -- end_ignore |
| |
| -- Create writable external table with AS for DELIMITER , NULL, ESCAPE |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv1 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv1.tbl' FORMAT 'CSV' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' '); |
| |
| -- Create writable external table without AS for DELIMITER , NULL, ESCAPE |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv2 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv2.tbl' FORMAT 'CSV' (DELIMITER AS ',' NULL 'null' ESCAPE ' '); |
| |
| -- Create writable external table with double quotes |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv3 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv3.tbl' FORMAT 'CSV' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ' QUOTE AS '"'); |
| |
| -- Create writable external table with single quotes |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv4 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv4.tbl' FORMAT 'CSV' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ' QUOTE AS ''''); |
| |
| -- Create writable external table with force quote |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv5 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv5.tbl' FORMAT 'CSV' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ' QUOTE AS '"' FORCE QUOTE b); |
| |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_csv6 (a int, b text, c text) EXECUTE 'cat > @abs_srcdir@/data/wet_csv6.tbl' FORMAT 'CSV' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ' QUOTE AS '"' FORCE QUOTE *); |
| |
| INSERT INTO tbl_wet_csv1 VALUES (generate_series(1,256), 'test_1'); |
| INSERT INTO tbl_wet_csv2 VALUES (generate_series(1,256), 'test_2'); |
| INSERT INTO tbl_wet_csv3 VALUES (generate_series(1,256), 'test_3'); |
| INSERT INTO tbl_wet_csv4 VALUES (generate_series(1,256), 'test_4'); |
| INSERT INTO tbl_wet_csv5 VALUES (generate_series(1,256), 'test_5'); |
| INSERT INTO tbl_wet_csv6 VALUES (generate_series(1,256), 'test_6', 'test_6_1'); |
| |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv3; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv4; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv5; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_csv6; |
| |
| -- start_ignore |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text3; |
| -- end_ignore |
| |
| -- Create writable external table with AS for DELIMITER , NULL, ESCAPE |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_text1 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_text1.tbl' FORMAT 'TEXT' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' '); |
| |
| -- Create writable external table without AS for DELIMITER , NULL, ESCAPE |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_text2 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_text2.tbl' FORMAT 'TEXT' (DELIMITER AS ',' NULL 'null' ESCAPE ' '); |
| |
| -- Create writable external table with ESCAPE OFF |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_text3 (a int, b text) EXECUTE 'cat > @abs_srcdir@/data/wet_text3.tbl' FORMAT 'TEXT' (DELIMITER AS '|' NULL AS 'null' ESCAPE 'OFF'); |
| |
| INSERT INTO tbl_wet_text1 VALUES (generate_series(1,256), 'test_1'); |
| INSERT INTO tbl_wet_text2 VALUES (generate_series(1,256), 'test_2'); |
| INSERT INTO tbl_wet_text3 VALUES (generate_series(1,256), 'test_3'); |
| |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_text3; |
| |
| -- start_ignore |
| DROP TABLE IF EXISTS test_dp1; |
| DROP TABLE IF EXISTS test_dp2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax3; |
| -- end_ignore |
| |
| CREATE TABLE test_dp1 (a int, b text) DISTRIBUTED RANDOMLY; |
| CREATE TABLE test_dp2 (a int, b text) DISTRIBUTED BY (b); |
| |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_syntax1 (like test_dp1) EXECUTE 'cat > @abs_srcdir@/data/wet_syntax1.tbl' FORMAT 'TEXT' (DELIMITER '|' ) DISTRIBUTED BY (a); |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_syntax2 (like test_dp2) EXECUTE 'cat > @abs_srcdir@/data/wet_syntax2.tbl' FORMAT 'TEXT' (DELIMITER '|' ) DISTRIBUTED BY (a); |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_syntax3 (like test_dp2) EXECUTE 'cat > @abs_srcdir@/data/wet_syntax3.tbl' FORMAT 'TEXT' (DELIMITER '|' ) DISTRIBUTED RANDOMLY; |
| |
| INSERT INTO tbl_wet_syntax1 VALUES (generate_series(1,256), 'test_1'); |
| INSERT INTO tbl_wet_syntax2 VALUES (generate_series(1,256), 'test_2'); |
| INSERT INTO tbl_wet_syntax3 VALUES (generate_series(1,256), 'test_3'); |
| |
| DROP TABLE IF EXISTS test_dp1; |
| DROP TABLE IF EXISTS test_dp2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax1; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax2; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_syntax3; |
| |
| -- start_ignore |
| DROP TABLE IF EXISTS table_execute; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_execute; |
| -- end_ignore |
| |
| CREATE TABLE table_execute (id integer, name varchar(40)) DISTRIBUTED RANDOMLY; |
| |
| INSERT INTO table_execute VALUES (100, 'name_1'); |
| INSERT INTO table_execute VALUES (200, 'name_2'); |
| INSERT INTO table_execute VALUES (300, 'name_3'); |
| |
| CREATE WRITABLE EXTERNAL WEB TABLE tbl_wet_execute (like table_execute) EXECUTE 'cat > @abs_srcdir@/data/wet_execute.tbl' FORMAT 'TEXT' (DELIMITER '|' ); |
| |
| INSERT INTO tbl_wet_execute SELECT * from table_execute ; |
| |
| DROP TABLE IF EXISTS table_execute; |
| DROP EXTERNAL TABLE IF EXISTS tbl_wet_execute; |
| |
| -- start_ignore |
| -- drop temp external protocols |
| DROP PROTOCOL if exists demoprot; |
| DROP PROTOCOL if exists demoprot2; |
| -- end_ignore |
| |
| -- create external protocol |
| CREATE OR REPLACE FUNCTION write_to_file() RETURNS integer as '$libdir/gpextprotocol.so', 'demoprot_export' LANGUAGE C STABLE NO SQL; |
| CREATE OR REPLACE FUNCTION read_from_file() RETURNS integer as '$libdir/gpextprotocol.so', 'demoprot_import' LANGUAGE C STABLE NO SQL; |
| CREATE TRUSTED PROTOCOL demoprot (readfunc = 'read_from_file', writefunc = 'write_to_file'); |
| |
| -- alter external protocol's name |
| ALTER PROTOCOL demoprot RENAME TO demoprot2; |
| |
| -- type name is a fixed-length string padded by '\0', normal(wrong) |
| -- renaming will make cdbhash() getting different values, select |
| -- displaying more than oneline here |
| select distinct ptcname from ( |
| select ptcname AS ptcname from gp_dist_random('pg_extprotocol') |
| ) all_segments where ptcname = 'demoprot2'; |
| |
| -- drop temp external protocols |
| DROP PROTOCOL if exists demoprot; |
| DROP PROTOCOL if exists demoprot2; |
| |
| -- create external protocol with a serial type column |
| CREATE EXTERNAL TABLE SERIAL (a serial, x text) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/no/such/place/serial.tbl') |
| FORMAT 'csv'; |
| |
| -- drop temp external table |
| DROP EXTERNAL TABLE IF EXISTS serial; |
| |
| -- External table query within plpgSQL function get error |
| CREATE EXTERNAL TABLE exttab_error_context_callback(c1 int, c2 int) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/exttab.data') FORMAT 'TEXT'; |
| |
| CREATE or REPLACE FUNCTION exttab_error_context_callback_func() |
| RETURNS SETOF INTEGER |
| AS |
| $$ |
| DECLARE |
| ret INTEGER; |
| BEGIN |
| FOR ret IN |
| SELECT c2 from exttab_error_context_callback |
| LOOP |
| RETURN NEXT ret; |
| END LOOP; |
| END |
| $$ |
| LANGUAGE plpgSQL READS SQL DATA; |
| |
| SET gp_log_gang TO DEBUG; |
| |
| SELECT * FROM exttab_error_context_callback_func(); |
| |
| SET gp_log_gang TO DEFAULT; |
| |
| DROP FUNCTION exttab_error_context_callback_func(); |
| DROP EXTERNAL TABLE exttab_error_context_callback; |
| |
| -- -------------------------------------- |
| -- Encoding |
| -- -------------------------------------- |
| |
| CREATE EXTERNAL TABLE encoding_issue (num int, word text) |
| LOCATION ('file://@hostname@@abs_srcdir@/data/latin1_encoding.csv') |
| FORMAT 'CSV' ENCODING 'LATIN1'; |
| |
| SELECT * FROM encoding_issue WHERE num = 4; |
| |
| COPY (SELECT * FROM encoding_issue) TO '/tmp/latin1_encoding.csv' WITH (FORMAT 'csv', ENCODING 'LATIN1'); |
| |
| CREATE EXTERNAL TABLE encoding_issue2 (num int, word text) |
| LOCATION ('file://@hostname@/tmp/latin1_encoding.csv') |
| FORMAT 'CSV' ENCODING 'LATIN1'; |
| |
| SELECT * FROM encoding_issue2 WHERE num = 5; |
| |
| DROP EXTERNAL TABLE encoding_issue; |
| DROP EXTERNAL TABLE encoding_issue2; |
| |
| -- -------------------------------------- |
| -- Formatting |
| -- -------------------------------------- |
| -- Illegal formatter option on CSV format |
| CREATE EXTERNAL TABLE illegal_formatter (a integer, b integer) |
| LOCATION ('file://localhost/data') |
| FORMAT 'csv' (formatter='fixedwidth_in', address='46'); |
| |
| -- large custom format table definitions |
| create readable external table large_custom_format_definitions ( |
| address varchar(46), |
| state varchar(2), |
| zipcode int, |
| id int, |
| id_last_two int, |
| id_last_three int, |
| hhid int, |
| efxid int, |
| riskscore int, |
| cid varchar(18), |
| flag varchar(1), |
| census_tract int, |
| census_block int, |
| census_code int, |
| address_flag varchar(1), |
| cust_attr1 int, |
| cust_attr2 int, |
| cust_attr3 int, |
| cust_attr4 int, |
| cust_attr5 varchar(1), |
| cust_attr6 varchar(1), |
| cust_attr7 int, |
| cust_attr8 int, |
| cust_attr9 int, |
| cust_attr10 int, |
| cust_attr11 varchar(2), |
| cust_attr12 varchar(1), |
| cust_attr13 int, |
| cust_attr14 int, |
| cust_attr15 int, |
| cust_attr16 int, |
| cust_attr17 varchar(1), |
| cust_attr18 varchar(1), |
| cust_attr19 int, |
| cust_attr20 int, |
| cust_attr21 int, |
| cust_attr22 int, |
| cust_attr23 varchar(2), |
| cust_attr24 varchar(1), |
| cust_attr25 int, |
| cust_attr26 int, |
| cust_attr27 int, |
| cust_attr28 int, |
| cust_attr29 varchar(1), |
| cust_attr30 varchar(1), |
| cust_attr31 int, |
| cust_attr32 int, |
| cust_attr33 int, |
| cust_attr34 int, |
| cust_attr35 varchar(2), |
| cust_attr36 varchar(1), |
| cust_attr37 int, |
| cust_attr38 int, |
| cust_attr39 int, |
| cust_attr40 int, |
| cust_attr41 varchar(1), |
| cust_attr42 varchar(1), |
| cust_attr43 int, |
| cust_attr44 int, |
| cust_attr45 int, |
| cust_attr46 int, |
| cust_attr47 varchar(2), |
| cust_attr48 varchar(1), |
| cust_attr49 int, |
| cust_attr50 int, |
| cust_attr51 int, |
| cust_attr52 int, |
| cust_attr53 varchar(1), |
| cust_attr54 varchar(1), |
| cust_attr55 int, |
| cust_attr56 int, |
| cust_attr57 int, |
| cust_attr58 int, |
| cust_attr59 varchar(2), |
| cust_attr60 varchar(1), |
| cust_attr61 int, |
| cust_attr62 int, |
| cust_attr63 int, |
| cust_attr64 int, |
| cust_attr65 varchar(1), |
| cust_attr66 varchar(1), |
| cust_attr67 int, |
| cust_attr68 int, |
| cust_attr69 int, |
| cust_attr70 int, |
| cust_attr71 varchar(2), |
| cust_attr72 varchar(1), |
| cust_attr73 int, |
| cust_attr74 int, |
| cust_attr75 int, |
| cust_attr76 int, |
| cust_attr77 varchar(1), |
| cust_attr78 varchar(1), |
| cust_attr79 int, |
| cust_attr80 int, |
| cust_attr81 int, |
| cust_attr82 int, |
| cust_attr83 varchar(2), |
| cust_attr84 varchar(1), |
| cust_attr85 int, |
| cust_attr86 int, |
| cust_attr87 int, |
| cust_attr88 int, |
| cust_attr89 varchar(1), |
| cust_attr90 varchar(1), |
| cust_attr91 int, |
| cust_attr92 int, |
| cust_attr93 int, |
| cust_attr94 int, |
| cust_attr95 varchar(2), |
| cust_attr96 varchar(1), |
| cust_attr97 int, |
| cust_attr98 int, |
| cust_attr99 int, |
| cust_attr100 int, |
| cust_attr101 varchar(1), |
| cust_attr102 varchar(1), |
| cust_attr103 int, |
| cust_attr104 int, |
| cust_attr105 int, |
| cust_attr106 int, |
| cust_attr107 varchar(2), |
| cust_attr108 varchar(1), |
| cust_attr109 int, |
| cust_attr110 int, |
| cust_attr111 int, |
| cust_attr112 int, |
| cust_attr113 varchar(1), |
| cust_attr114 varchar(1), |
| cust_attr115 int, |
| cust_attr116 int, |
| cust_attr117 int, |
| cust_attr118 int, |
| cust_attr119 varchar(2), |
| cust_attr120 varchar(1), |
| cust_attr121 int, |
| cust_attr122 int, |
| cust_attr123 int, |
| cust_attr124 int, |
| cust_attr125 varchar(1), |
| cust_attr126 varchar(1), |
| cust_attr127 int, |
| cust_attr128 int, |
| cust_attr129 int, |
| cust_attr130 int, |
| cust_attr131 varchar(2), |
| cust_attr132 varchar(1), |
| cust_attr133 int, |
| cust_attr134 int, |
| cust_attr135 int, |
| cust_attr136 int, |
| cust_attr137 varchar(1), |
| cust_attr138 varchar(1), |
| cust_attr139 int, |
| cust_attr140 int, |
| cust_attr141 int, |
| cust_attr142 int, |
| cust_attr143 varchar(2), |
| cust_attr144 varchar(1), |
| cust_attr145 int, |
| cust_attr146 int, |
| cust_attr147 int, |
| cust_attr148 int, |
| cust_attr149 varchar(1), |
| cust_attr150 varchar(1), |
| cust_attr151 int, |
| cust_attr152 int, |
| cust_attr153 int, |
| cust_attr154 int, |
| cust_attr155 varchar(2), |
| cust_attr156 varchar(1), |
| cust_attr157 int, |
| cust_attr158 int, |
| cust_attr159 int, |
| cust_attr160 int, |
| cust_attr161 varchar(1), |
| cust_attr162 varchar(1), |
| cust_attr163 int, |
| cust_attr164 int, |
| cust_attr165 int, |
| cust_attr166 int, |
| cust_attr167 varchar(2), |
| cust_attr168 varchar(1), |
| cust_attr169 int, |
| cust_attr170 int, |
| cust_attr171 int, |
| cust_attr172 int, |
| cust_attr173 varchar(1), |
| cust_attr174 varchar(1), |
| cust_attr175 int, |
| cust_attr176 int, |
| cust_attr177 int, |
| cust_attr178 int, |
| cust_attr179 varchar(2), |
| cust_attr180 varchar(1), |
| cust_attr181 int, |
| cust_attr182 int, |
| cust_attr183 int, |
| cust_attr184 int, |
| cust_attr185 varchar(1), |
| cust_attr186 varchar(1), |
| cust_attr187 int, |
| cust_attr188 int, |
| cust_attr189 int, |
| cust_attr190 int, |
| cust_attr191 varchar(2), |
| cust_attr192 varchar(1), |
| cust_attr193 int, |
| cust_attr194 int, |
| cust_attr195 int, |
| cust_attr196 int, |
| cust_attr197 varchar(1), |
| cust_attr198 varchar(1), |
| cust_attr199 int, |
| cust_attr200 int, |
| cust_attr201 int, |
| cust_attr202 int, |
| cust_attr203 varchar(2), |
| cust_attr204 varchar(1), |
| cust_attr205 int, |
| cust_attr206 int, |
| cust_attr207 int, |
| cust_attr208 int, |
| cust_attr209 varchar(1), |
| cust_attr210 varchar(1), |
| cust_attr211 int, |
| cust_attr212 int, |
| cust_attr213 int, |
| cust_attr214 int, |
| cust_attr215 varchar(2), |
| cust_attr216 varchar(1), |
| cust_attr217 int, |
| cust_attr218 int, |
| cust_attr219 int, |
| cust_attr220 int, |
| cust_attr221 varchar(1), |
| cust_attr222 varchar(1), |
| cust_attr223 int, |
| cust_attr224 int, |
| cust_attr225 int, |
| cust_attr226 int, |
| cust_attr227 varchar(2), |
| cust_attr228 varchar(1), |
| cust_attr229 int, |
| cust_attr230 int, |
| cust_attr231 int, |
| cust_attr232 int, |
| cust_attr233 varchar(1), |
| cust_attr234 varchar(1), |
| cust_attr235 int, |
| cust_attr236 int, |
| cust_attr237 int, |
| cust_attr238 int, |
| cust_attr239 varchar(2), |
| cust_attr240 varchar(1), |
| cust_attr241 int, |
| cust_attr242 int, |
| cust_attr243 int, |
| cust_attr244 int, |
| cust_attr245 varchar(1), |
| cust_attr246 varchar(1), |
| cust_attr247 int, |
| cust_attr248 int, |
| cust_attr249 int, |
| cust_attr250 int, |
| cust_attr251 varchar(2), |
| cust_attr252 varchar(1), |
| cust_attr253 int, |
| cust_attr254 int, |
| cust_attr255 int, |
| cust_attr256 int, |
| cust_attr257 varchar(1), |
| cust_attr258 varchar(1), |
| cust_attr259 int, |
| cust_attr260 int, |
| cust_attr261 int, |
| cust_attr262 int, |
| cust_attr263 varchar(2), |
| cust_attr264 varchar(1), |
| cust_attr265 int, |
| cust_attr266 int, |
| cust_attr267 int, |
| cust_attr268 int, |
| cust_attr269 varchar(1), |
| cust_attr270 varchar(1), |
| cust_attr271 int, |
| cust_attr272 int, |
| cust_attr273 int, |
| cust_attr274 int, |
| cust_attr275 varchar(2), |
| cust_attr276 varchar(1), |
| cust_attr277 int, |
| cust_attr278 int, |
| cust_attr279 int, |
| cust_attr280 int, |
| cust_attr281 varchar(1), |
| cust_attr282 varchar(1), |
| cust_attr283 int, |
| cust_attr284 int, |
| cust_attr285 int, |
| cust_attr286 int, |
| cust_attr287 varchar(2), |
| cust_attr288 varchar(1), |
| cust_attr289 int, |
| cust_attr290 varchar(1), |
| cust_attr291 varchar(1), |
| cust_attr292 varchar(1), |
| cust_attr293 int, |
| cust_attr294 int, |
| cust_attr295 int, |
| cust_attr296 int, |
| cust_attr297 int, |
| cust_attr298 int, |
| cust_attr299 int, |
| cust_attr300 int, |
| cust_attr301 int, |
| cust_attr302 int, |
| cust_attr303 int, |
| cust_attr304 int, |
| cust_attr305 int, |
| cust_attr306 int, |
| cust_attr307 int, |
| cust_attr308 int, |
| cust_attr309 int, |
| cust_attr310 int, |
| cust_attr311 int, |
| cust_attr312 int, |
| cust_attr313 int, |
| cust_attr314 int, |
| cust_attr315 int, |
| cust_attr316 int, |
| cust_attr317 int, |
| cust_attr318 int, |
| cust_attr319 int, |
| cust_attr320 int, |
| cust_attr321 int, |
| cust_attr322 int, |
| cust_attr323 int, |
| cust_attr324 int, |
| cust_attr325 int, |
| cust_attr326 int, |
| cust_attr327 int, |
| cust_attr328 int, |
| cust_attr329 int, |
| cust_attr330 int, |
| cust_attr331 int, |
| cust_attr332 int, |
| cust_attr333 int, |
| cust_attr334 int, |
| cust_attr335 int, |
| cust_attr336 int, |
| cust_attr337 int, |
| cust_attr338 int, |
| cust_attr339 int, |
| cust_attr340 int, |
| cust_attr341 varchar(1), |
| crtr_attr1 int, |
| crtr_attr2 int, |
| crtr_attr3 int, |
| crtr_attr4 int, |
| crtr_attr5 int, |
| crtr_attr6 int, |
| crtr_attr7 int, |
| crtr_attr8 int, |
| crtr_attr9 int, |
| crtr_attr10 int, |
| crtr_attr11 int, |
| crtr_attr12 int, |
| crtr_attr13 int, |
| crtr_attr14 int, |
| crtr_attr15 int, |
| crtr_attr16 int, |
| crtr_attr17 int, |
| crtr_attr18 int, |
| crtr_attr19 int, |
| crtr_attr20 int, |
| crtr_attr21 int, |
| crtr_attr22 int, |
| crtr_attr23 int, |
| crtr_attr24 int, |
| crtr_attr25 int, |
| crtr_attr26 int, |
| crtr_attr27 int, |
| crtr_attr28 int, |
| crtr_attr29 int, |
| crtr_attr30 int, |
| crtr_attr31 int, |
| crtr_attr32 int, |
| crtr_attr33 int, |
| crtr_attr34 int, |
| crtr_attr35 int, |
| crtr_attr36 int, |
| crtr_attr37 int, |
| crtr_attr38 int, |
| crtr_attr39 int, |
| crtr_attr40 int, |
| crtr_attr41 int, |
| crtr_attr42 int, |
| crtr_attr43 int, |
| crtr_attr44 int, |
| crtr_attr45 int, |
| crtr_attr46 int, |
| crtr_attr47 int, |
| crtr_attr48 int, |
| crtr_attr49 int, |
| crtr_attr50 int, |
| crtr_attr51 int, |
| crtr_attr52 int, |
| crtr_attr53 int, |
| crtr_attr54 int, |
| crtr_attr55 int, |
| crtr_attr56 int, |
| crtr_attr57 int, |
| crtr_attr58 int, |
| crtr_attr59 int, |
| crtr_attr60 int, |
| crtr_attr61 int, |
| crtr_attr62 int, |
| crtr_attr63 int, |
| crtr_attr64 int, |
| crtr_attr65 int, |
| crtr_attr66 int, |
| crtr_attr67 int, |
| crtr_attr68 int, |
| crtr_attr69 int, |
| crtr_attr70 int, |
| crtr_attr71 int, |
| crtr_attr72 int, |
| crtr_attr73 int, |
| crtr_attr74 int, |
| crtr_attr75 int, |
| crtr_attr76 int, |
| crtr_attr77 int, |
| crtr_attr78 int, |
| crtr_attr79 int, |
| crtr_attr80 int, |
| crtr_attr81 int, |
| crtr_attr82 int, |
| crtr_attr83 int, |
| crtr_attr84 int, |
| crtr_attr85 int, |
| crtr_attr86 int, |
| crtr_attr87 int, |
| crtr_attr88 int, |
| crtr_attr89 int, |
| crtr_attr90 int, |
| crtr_attr91 int, |
| crtr_attr92 int, |
| crtr_attr93 int, |
| crtr_attr94 int, |
| crtr_attr95 int, |
| crtr_attr96 int, |
| crtr_attr97 int, |
| crtr_attr98 int, |
| crtr_attr99 int, |
| crtr_attr100 int, |
| crtr_attr101 int, |
| crtr_attr102 int, |
| crtr_attr103 int, |
| crtr_attr104 int, |
| crtr_attr105 int, |
| crtr_attr106 int, |
| crtr_attr107 int, |
| crtr_attr108 int, |
| crtr_attr109 int, |
| crtr_attr110 int, |
| crtr_attr111 int, |
| crtr_attr112 int, |
| crtr_attr113 int, |
| crtr_attr114 int, |
| crtr_attr115 int, |
| crtr_attr116 int, |
| crtr_attr117 int, |
| crtr_attr118 int, |
| crtr_attr119 int, |
| crtr_attr120 int, |
| crtr_attr121 int, |
| crtr_attr122 int, |
| crtr_attr123 int, |
| crtr_attr124 int, |
| crtr_attr125 int, |
| crtr_attr126 int, |
| crtr_attr127 int, |
| crtr_attr128 int, |
| crtr_attr129 int, |
| crtr_attr130 int, |
| crtr_attr131 int, |
| crtr_attr132 int, |
| crtr_attr133 int, |
| crtr_attr134 int, |
| crtr_attr135 int, |
| crtr_attr136 int, |
| crtr_attr137 int, |
| crtr_attr138 int, |
| crtr_attr139 int, |
| crtr_attr140 int, |
| crtr_attr141 int, |
| crtr_attr142 int, |
| crtr_attr143 int, |
| crtr_attr144 int, |
| crtr_attr145 int, |
| crtr_attr146 int, |
| crtr_attr147 int, |
| crtr_attr148 int, |
| crtr_attr149 int, |
| crtr_attr150 int, |
| crtr_attr151 int, |
| crtr_attr152 int, |
| crtr_attr153 int, |
| crtr_attr154 int, |
| crtr_attr155 int, |
| crtr_attr156 int, |
| crtr_attr157 int, |
| crtr_attr158 int, |
| crtr_attr159 int, |
| crtr_attr160 int, |
| crtr_attr161 int, |
| crtr_attr162 int, |
| crtr_attr163 int, |
| crtr_attr164 int, |
| crtr_attr165 int, |
| crtr_attr166 int, |
| crtr_attr167 int, |
| crtr_attr168 int, |
| crtr_attr169 int, |
| crtr_attr170 int, |
| crtr_attr171 int, |
| crtr_attr172 int, |
| crtr_attr173 int, |
| crtr_attr174 int, |
| crtr_attr175 int, |
| crtr_attr176 int, |
| crtr_attr177 int, |
| crtr_attr178 int, |
| crtr_attr179 int, |
| crtr_attr180 int, |
| crtr_attr181 int, |
| crtr_attr182 int, |
| crtr_attr183 int, |
| crtr_attr184 int, |
| crtr_attr185 int, |
| crtr_attr186 int, |
| crtr_attr187 int, |
| cma_attr3746 int, |
| cma_attr3000 int, |
| cma_attr3001 int, |
| cma_attr3002 int, |
| cma_attr3100 int, |
| cma_attr3102 int, |
| cma_attr3104 int, |
| cma_attr3105 int, |
| cma_attr3109 int, |
| cma_attr3111 int, |
| cma_attr3113 int, |
| cma_attr3116 int, |
| cma_attr3117 int, |
| cma_attr3119 int, |
| cma_attr3120 int, |
| cma_attr3122 int, |
| cma_attr3123 int, |
| cma_attr3124 int, |
| cma_attr3126 int, |
| cma_attr3127 int, |
| cma_attr3131 int, |
| cma_attr3132 int, |
| cma_attr3133 int, |
| cma_attr3134 int, |
| cma_attr3135 int, |
| cma_attr3136 int, |
| cma_attr3137 int, |
| cma_attr3138 int, |
| cma_attr3139 int, |
| cma_attr3140 int, |
| cma_attr3141 int, |
| cma_attr3142 int, |
| cma_attr3143 int, |
| cma_attr3144 int, |
| cma_attr3145 int, |
| cma_attr3146 int, |
| cma_attr3147 int, |
| cma_attr3148 int, |
| cma_attr3150 int, |
| cma_attr3152 int, |
| cma_attr3153 int, |
| cma_attr3157 int, |
| cma_attr3159 int, |
| cma_attr3160 int, |
| cma_attr3161 int, |
| cma_attr3162 int, |
| cma_attr3163 int, |
| cma_attr3164 int, |
| cma_attr3165 int, |
| cma_attr3166 int, |
| cma_attr3167 int, |
| cma_attr3168 int, |
| cma_attr3169 int, |
| cma_attr3203 int, |
| cma_attr3204 int, |
| cma_attr3205 int, |
| cma_attr3206 int, |
| cma_attr3207 int, |
| cma_attr3208 int, |
| cma_attr3215 int, |
| cma_attr3217 int, |
| cma_attr3219 int, |
| cma_attr3223 int, |
| cma_attr3224 int, |
| cma_attr3228 int, |
| cma_attr3231 int, |
| cma_attr3234 int, |
| cma_attr3235 int, |
| cma_attr3236 int, |
| cma_attr3237 int, |
| cma_attr3239 int, |
| cma_attr3242 int, |
| cma_attr3245 int, |
| cma_attr3246 int, |
| cma_attr3257 int, |
| cma_attr3266 int, |
| cma_attr3268 int, |
| cma_attr3270 int, |
| cma_attr3272 int, |
| cma_attr3273 int, |
| cma_attr3276 int, |
| cma_attr3277 int, |
| cma_attr3285 int, |
| cma_attr3286 int, |
| cma_attr3288 int, |
| cma_attr3290 int, |
| cma_attr3292 int, |
| cma_attr3293 int, |
| cma_attr3296 int, |
| cma_attr3297 int, |
| cma_attr3307 int, |
| cma_attr3309 int, |
| cma_attr3311 int, |
| cma_attr3312 int, |
| cma_attr3315 int, |
| cma_attr3316 int, |
| cma_attr3318 int, |
| cma_attr3320 int, |
| cma_attr3322 int, |
| cma_attr3323 int, |
| cma_attr3326 int, |
| cma_attr3327 int, |
| cma_attr3329 int, |
| cma_attr3330 int, |
| cma_attr3332 int, |
| cma_attr3333 int, |
| cma_attr3335 int, |
| cma_attr3336 int, |
| cma_attr3338 int, |
| cma_attr3340 int, |
| cma_attr3347 int, |
| cma_attr3368 int, |
| cma_attr3370 int, |
| cma_attr3376 int, |
| cma_attr3379 int, |
| cma_attr3380 int, |
| cma_attr3382 int, |
| cma_attr3383 int, |
| cma_attr3385 int, |
| cma_attr3386 int, |
| cma_attr3387 int, |
| cma_attr3388 int, |
| cma_attr3389 int, |
| cma_attr3391 int, |
| cma_attr3392 int, |
| cma_attr3394 int, |
| cma_attr3395 int, |
| cma_attr3396 int, |
| cma_attr3397 int, |
| cma_attr3398 int, |
| cma_attr3400 int, |
| cma_attr3401 int, |
| cma_attr3403 int, |
| cma_attr3404 int, |
| cma_attr3405 int, |
| cma_attr3406 int, |
| cma_attr3407 int, |
| cma_attr3409 int, |
| cma_attr3410 int, |
| cma_attr3412 int, |
| cma_attr3413 int, |
| cma_attr3414 int, |
| cma_attr3415 int, |
| cma_attr3417 int, |
| cma_attr3419 int, |
| cma_attr3420 int, |
| cma_attr3422 int, |
| cma_attr3423 int, |
| cma_attr3424 int, |
| cma_attr3425 int, |
| cma_attr3426 int, |
| cma_attr3428 int, |
| cma_attr3430 int, |
| cma_attr3431 int, |
| cma_attr3433 int, |
| cma_attr3434 int, |
| cma_attr3435 int, |
| cma_attr3436 int, |
| cma_attr3437 int, |
| cma_attr3439 int, |
| cma_attr3441 int, |
| cma_attr3442 int, |
| cma_attr3444 int, |
| cma_attr3445 int, |
| cma_attr3446 int, |
| cma_attr3447 int, |
| cma_attr3448 int, |
| cma_attr3450 int, |
| cma_attr3452 int, |
| cma_attr3453 int, |
| cma_attr3455 int, |
| cma_attr3456 int, |
| cma_attr3457 int, |
| cma_attr3458 int, |
| cma_attr3535 int, |
| cma_attr3536 int, |
| cma_attr3537 int, |
| cma_attr3539 int, |
| cma_attr3540 int, |
| cma_attr3544 int, |
| cma_attr3546 int, |
| cma_attr3547 int, |
| cma_attr3548 int, |
| cma_attr3550 int, |
| cma_attr3551 int, |
| cma_attr3555 int, |
| cma_attr3557 int, |
| cma_attr3558 int, |
| cma_attr3559 int, |
| cma_attr3561 int, |
| cma_attr3562 int, |
| cma_attr3566 int, |
| cma_attr3568 int, |
| cma_attr3569 int, |
| cma_attr3570 int, |
| cma_attr3572 int, |
| cma_attr3573 int, |
| cma_attr3577 int, |
| cma_attr3579 int, |
| cma_attr3580 int, |
| cma_attr3592 int, |
| cma_attr3593 int, |
| cma_attr3594 int, |
| cma_attr3596 int, |
| cma_attr3597 int, |
| cma_attr3598 int, |
| cma_attr3600 int, |
| cma_attr3601 int, |
| cma_attr3602 int, |
| cma_attr3603 int, |
| cma_attr3605 int, |
| cma_attr3607 int, |
| cma_attr3608 int, |
| cma_attr3611 int, |
| cma_attr3612 int, |
| cma_attr3723 int, |
| cma_attr3724 int, |
| cma_attr3725 int, |
| cma_attr3726 int, |
| cma_attr3727 int, |
| cma_attr3728 int, |
| cma_attr3729 int, |
| cma_attr3900 int, |
| cma_attr3901 int, |
| cma_attr3902 varchar(1), |
| cma_attr3903 varchar(1), |
| cma_attr3904 varchar(1), |
| cma_attr3905 varchar(1), |
| cma_attr3907 int, |
| cma_attr3908 int, |
| cma_attr3909 int, |
| cma_attr3911 int, |
| cma_attr3912 int, |
| cma_attr3913 int, |
| cma_attr3747 int, |
| cma_attr3748 int, |
| cma_attr3749 int, |
| cma_attr3750 int, |
| cma_attr3751 int, |
| cma_attr3752 int, |
| cma_attr3753 int, |
| cma_attr3754 int, |
| cma_attr3812 int, |
| cma_attr3813 int, |
| cma_attr3993 int, |
| cma_attr3994 int, |
| cma_attr3995 int, |
| cma_attr3825 int, |
| cma_attr3826 int, |
| cma_attr3827 int, |
| cma_attr3828 int, |
| cma_attr3829 int, |
| cma_attr3830 int, |
| cma_attr3831 int, |
| cma_attr3832 int, |
| cma_attr3833 int, |
| cma_attr3834 int, |
| cma_attr3835 int, |
| cma_attr3836 int, |
| cma_attr3837 int, |
| cma_attr3838 int, |
| cma_attr3839 int, |
| cma_attr3840 int, |
| cma_attr3841 int, |
| cma_attr3842 int, |
| cma_attr3843 int, |
| cma_attr3844 int, |
| cma_attr3845 int, |
| cma_attr3854 int, |
| cma_attr3855 int, |
| cma_attr3856 int, |
| cma_attr3857 int, |
| cma_attr3858 int, |
| cma_attr3859 int, |
| cma_attr3860 int, |
| cma_attr3861 int, |
| cma_attr3862 int, |
| cma_attr3863 int, |
| cma_attr3864 int, |
| cma_attr3865 int, |
| cma_attr3866 int, |
| cma_attr3867 int, |
| cma_attr3868 int, |
| cma_attr3869 int, |
| cma_attr3938 int, |
| cma_attr3939 int, |
| cma_attr3940 int, |
| cma_attr3870 int, |
| cma_attr3871 int, |
| cma_attr3872 int, |
| cma_attr3873 int, |
| cma_attr3874 int, |
| cma_attr3875 int, |
| cma_attr3876 int, |
| cma_attr3877 int, |
| cma_attr3878 int, |
| cma_attr3879 int, |
| cma_attr3880 int, |
| cma_attr3881 int, |
| cma_attr3882 int, |
| cma_attr3883 int, |
| cma_attr3884 int, |
| cma_attr3885 int, |
| cma_attr3917 int, |
| cma_attr3918 int, |
| cma_attr3919 int, |
| cma_attr3920 int, |
| cma_attr3921 int, |
| cma_attr3922 int, |
| cma_attr3923 int, |
| cma_attr3924 int, |
| cma_attr3925 int, |
| cma_attr3926 int, |
| cma_attr3927 int, |
| cma_attr3928 int, |
| cma_attr3929 int, |
| cma_attr3930 int, |
| cma_attr3931 int, |
| cma_attr3932 int, |
| cma_attr3933 int, |
| cma_attr3886 int, |
| cma_attr3934 int, |
| cma_attr3887 int, |
| cma_attr3894 int, |
| cma_attr3895 int, |
| cma_attr3896 int, |
| cma_attr3897 int, |
| cma_attr3898 int, |
| cma_attr3899 int, |
| cma_attr3914 int, |
| cma_attr3915 int, |
| cma_attr3916 int, |
| cma_attr3941 int, |
| cma_attr3942 int, |
| cma_attr3943 int, |
| cma_attr3944 int, |
| cma_attr3945 int, |
| cma_attr3946 int, |
| cma_attr3947 int, |
| cma_attr3948 int, |
| cma_attr3949 int, |
| cma_attr3950 int, |
| cma_attr3951 int, |
| cma_attr3952 int, |
| cma_attr3953 int, |
| cma_attr3954 int, |
| cma_attr3955 int, |
| cma_attr3956 int, |
| cma_attr3957 int, |
| cma_attr3958 int, |
| cma_attr3959 int, |
| cma_attr3960 int, |
| cma_attr3961 int, |
| cma_attr3962 int, |
| cma_attr3963 int, |
| cma_attr3964 int, |
| cma_attr3968 int, |
| cma_attr3969 int, |
| cma_attr3970 int, |
| cma_attr3971 int, |
| cma_attr3973 int, |
| cma_attr3974 int, |
| cma_attr3975 int, |
| cma_attr3976 int, |
| cma_attr3978 int, |
| cma_attr3979 int, |
| cma_attr3980 int, |
| cma_attr3981 int, |
| cma_attr3983 int, |
| cma_attr3984 int, |
| cma_attr3985 int, |
| cma_attr3986 int, |
| cma_attr3987 int, |
| census_tract_2010 int, |
| census_block_2010 int, |
| county_code_2010 int |
| ) |
| LOCATION ('file://localhost/data') |
| FORMAT 'CUSTOM' (formatter=fixedwidth_in, |
| address='46', |
| unused='1', |
| state='2', |
| unused1='1', |
| zipcode='5', |
| unused2='1', |
| id='9', |
| unused3='1', |
| hhid='11', |
| unused4='1', |
| efxid='11', |
| unused5='1', |
| riskscore='3', |
| unused6='1', |
| cid='18', |
| unused7='1', |
| flag='1', |
| unused8='1', |
| census_tract='6', |
| unused9='1', |
| census_block='4', |
| unused10='1', |
| census_code='3', |
| unused11='1', |
| address_flag='1', |
| unused12='1', |
| cust_attr1='4', |
| cust_attr2='6', |
| cust_attr3='7', |
| cust_attr4='7', |
| cust_attr5='1', |
| cust_attr6='1', |
| cust_attr7='3', |
| cust_attr8='7', |
| cust_attr9='3', |
| cust_attr10='3', |
| cust_attr11='2', |
| cust_attr12='1', |
| cust_attr13='6', |
| cust_attr14='6', |
| cust_attr15='7', |
| cust_attr16='7', |
| cust_attr17='1', |
| cust_attr18='1', |
| cust_attr19='3', |
| cust_attr20='7', |
| cust_attr21='3', |
| cust_attr22='3', |
| cust_attr23='2', |
| cust_attr24='1', |
| cust_attr25='6', |
| cust_attr26='6', |
| cust_attr27='7', |
| cust_attr28='7', |
| cust_attr29='1', |
| cust_attr30='1', |
| cust_attr31='3', |
| cust_attr32='7', |
| cust_attr33='3', |
| cust_attr34='3', |
| cust_attr35='2', |
| cust_attr36='1', |
| cust_attr37='6', |
| cust_attr38='6', |
| cust_attr39='7', |
| cust_attr40='7', |
| cust_attr41='1', |
| cust_attr42='1', |
| cust_attr43='3', |
| cust_attr44='7', |
| cust_attr45='3', |
| cust_attr46='3', |
| cust_attr47='2', |
| cust_attr48='1', |
| cust_attr49='6', |
| cust_attr50='6', |
| cust_attr51='7', |
| cust_attr52='7', |
| cust_attr53='1', |
| cust_attr54='1', |
| cust_attr55='3', |
| cust_attr56='7', |
| cust_attr57='3', |
| cust_attr58='3', |
| cust_attr59='2', |
| cust_attr60='1', |
| cust_attr61='6', |
| cust_attr62='6', |
| cust_attr63='7', |
| cust_attr64='7', |
| cust_attr65='1', |
| cust_attr66='1', |
| cust_attr67='3', |
| cust_attr68='7', |
| cust_attr69='3', |
| cust_attr70='3', |
| cust_attr71='2', |
| cust_attr72='1', |
| cust_attr73='6', |
| cust_attr74='6', |
| cust_attr75='7', |
| cust_attr76='7', |
| cust_attr77='1', |
| cust_attr78='1', |
| cust_attr79='3', |
| cust_attr80='7', |
| cust_attr81='3', |
| cust_attr82='3', |
| cust_attr83='2', |
| cust_attr84='1', |
| cust_attr85='6', |
| cust_attr86='6', |
| cust_attr87='7', |
| cust_attr88='7', |
| cust_attr89='1', |
| cust_attr90='1', |
| cust_attr91='3', |
| cust_attr92='7', |
| cust_attr93='3', |
| cust_attr94='3', |
| cust_attr95='2', |
| cust_attr96='1', |
| cust_attr97='6', |
| cust_attr98='6', |
| cust_attr99='7', |
| cust_attr100='7', |
| cust_attr101='1', |
| cust_attr102='1', |
| cust_attr103='3', |
| cust_attr104='7', |
| cust_attr105='3', |
| cust_attr106='3', |
| cust_attr107='2', |
| cust_attr108='1', |
| cust_attr109='6', |
| cust_attr110='6', |
| cust_attr111='7', |
| cust_attr112='7', |
| cust_attr113='1', |
| cust_attr114='1', |
| cust_attr115='3', |
| cust_attr116='7', |
| cust_attr117='3', |
| cust_attr118='3', |
| cust_attr119='2', |
| cust_attr120='1', |
| cust_attr121='6', |
| cust_attr122='6', |
| cust_attr123='7', |
| cust_attr124='7', |
| cust_attr125='1', |
| cust_attr126='1', |
| cust_attr127='3', |
| cust_attr128='7', |
| cust_attr129='3', |
| cust_attr130='3', |
| cust_attr131='2', |
| cust_attr132='1', |
| cust_attr133='6', |
| cust_attr134='6', |
| cust_attr135='7', |
| cust_attr136='7', |
| cust_attr137='1', |
| cust_attr138='1', |
| cust_attr139='3', |
| cust_attr140='7', |
| cust_attr141='3', |
| cust_attr142='3', |
| cust_attr143='2', |
| cust_attr144='1', |
| cust_attr145='6', |
| cust_attr146='6', |
| cust_attr147='7', |
| cust_attr148='7', |
| cust_attr149='1', |
| cust_attr150='1', |
| cust_attr151='3', |
| cust_attr152='7', |
| cust_attr153='3', |
| cust_attr154='3', |
| cust_attr155='2', |
| cust_attr156='1', |
| cust_attr157='6', |
| cust_attr158='6', |
| cust_attr159='7', |
| cust_attr160='7', |
| cust_attr161='1', |
| cust_attr162='1', |
| cust_attr163='3', |
| cust_attr164='7', |
| cust_attr165='3', |
| cust_attr166='3', |
| cust_attr167='2', |
| cust_attr168='1', |
| cust_attr169='6', |
| cust_attr170='6', |
| cust_attr171='7', |
| cust_attr172='7', |
| cust_attr173='1', |
| cust_attr174='1', |
| cust_attr175='3', |
| cust_attr176='7', |
| cust_attr177='3', |
| cust_attr178='3', |
| cust_attr179='2', |
| cust_attr180='1', |
| cust_attr181='6', |
| cust_attr182='6', |
| cust_attr183='7', |
| cust_attr184='7', |
| cust_attr185='1', |
| cust_attr186='1', |
| cust_attr187='3', |
| cust_attr188='7', |
| cust_attr189='3', |
| cust_attr190='3', |
| cust_attr191='2', |
| cust_attr192='1', |
| cust_attr193='6', |
| cust_attr194='6', |
| cust_attr195='7', |
| cust_attr196='7', |
| cust_attr197='1', |
| cust_attr198='1', |
| cust_attr199='3', |
| cust_attr200='7', |
| cust_attr201='3', |
| cust_attr202='3', |
| cust_attr203='2', |
| cust_attr204='1', |
| cust_attr205='6', |
| cust_attr206='6', |
| cust_attr207='7', |
| cust_attr208='7', |
| cust_attr209='1', |
| cust_attr210='1', |
| cust_attr211='3', |
| cust_attr212='7', |
| cust_attr213='3', |
| cust_attr214='3', |
| cust_attr215='2', |
| cust_attr216='1', |
| cust_attr217='6', |
| cust_attr218='6', |
| cust_attr219='7', |
| cust_attr220='7', |
| cust_attr221='1', |
| cust_attr222='1', |
| cust_attr223='3', |
| cust_attr224='7', |
| cust_attr225='3', |
| cust_attr226='3', |
| cust_attr227='2', |
| cust_attr228='1', |
| cust_attr229='6', |
| cust_attr230='6', |
| cust_attr231='7', |
| cust_attr232='7', |
| cust_attr233='1', |
| cust_attr234='1', |
| cust_attr235='3', |
| cust_attr236='7', |
| cust_attr237='3', |
| cust_attr238='3', |
| cust_attr239='2', |
| cust_attr240='1', |
| cust_attr241='6', |
| cust_attr242='6', |
| cust_attr243='7', |
| cust_attr244='7', |
| cust_attr245='1', |
| cust_attr246='1', |
| cust_attr247='3', |
| cust_attr248='7', |
| cust_attr249='3', |
| cust_attr250='3', |
| cust_attr251='2', |
| cust_attr252='1', |
| cust_attr253='6', |
| cust_attr254='6', |
| cust_attr255='7', |
| cust_attr256='7', |
| cust_attr257='1', |
| cust_attr258='1', |
| cust_attr259='3', |
| cust_attr260='7', |
| cust_attr261='3', |
| cust_attr262='3', |
| cust_attr263='2', |
| cust_attr264='1', |
| cust_attr265='6', |
| cust_attr266='6', |
| cust_attr267='7', |
| cust_attr268='7', |
| cust_attr269='1', |
| cust_attr270='1', |
| cust_attr271='3', |
| cust_attr272='7', |
| cust_attr273='3', |
| cust_attr274='3', |
| cust_attr275='2', |
| cust_attr276='1', |
| cust_attr277='6', |
| cust_attr278='6', |
| cust_attr279='7', |
| cust_attr280='7', |
| cust_attr281='1', |
| cust_attr282='1', |
| cust_attr283='3', |
| cust_attr284='7', |
| cust_attr285='3', |
| cust_attr286='3', |
| cust_attr287='2', |
| cust_attr288='1', |
| cust_attr289='6', |
| cust_attr290='1', |
| cust_attr291='1', |
| cust_attr292='1', |
| cust_attr293='7', |
| cust_attr294='7', |
| cust_attr295='7', |
| cust_attr296='7', |
| cust_attr297='7', |
| cust_attr298='7', |
| cust_attr299='7', |
| cust_attr300='7', |
| cust_attr301='7', |
| cust_attr302='7', |
| cust_attr303='7', |
| cust_attr304='7', |
| cust_attr305='7', |
| cust_attr306='7', |
| cust_attr307='7', |
| cust_attr308='7', |
| cust_attr309='7', |
| cust_attr310='7', |
| cust_attr311='7', |
| cust_attr312='7', |
| cust_attr313='7', |
| cust_attr314='7', |
| cust_attr315='7', |
| cust_attr316='7', |
| cust_attr317='7', |
| cust_attr318='7', |
| cust_attr319='7', |
| cust_attr320='7', |
| cust_attr321='7', |
| cust_attr322='7', |
| cust_attr323='7', |
| cust_attr324='7', |
| cust_attr325='7', |
| cust_attr326='7', |
| cust_attr327='7', |
| cust_attr328='7', |
| cust_attr329='7', |
| cust_attr330='7', |
| cust_attr331='7', |
| cust_attr332='7', |
| cust_attr333='7', |
| cust_attr334='7', |
| cust_attr335='7', |
| cust_attr336='7', |
| cust_attr337='7', |
| cust_attr338='7', |
| cust_attr339='7', |
| cust_attr340='7', |
| cust_attr341='1', |
| crtr_attr1='2', |
| crtr_attr2='2', |
| crtr_attr3='2', |
| crtr_attr4='2', |
| crtr_attr5='2', |
| crtr_attr6='2', |
| crtr_attr7='2', |
| crtr_attr8='2', |
| crtr_attr9='2', |
| crtr_attr10='2', |
| crtr_attr11='2', |
| crtr_attr12='2', |
| crtr_attr13='2', |
| crtr_attr14='2', |
| crtr_attr15='2', |
| crtr_attr16='2', |
| crtr_attr17='2', |
| crtr_attr18='2', |
| crtr_attr19='2', |
| crtr_attr20='2', |
| crtr_attr21='2', |
| crtr_attr22='2', |
| crtr_attr23='2', |
| crtr_attr24='2', |
| crtr_attr25='2', |
| crtr_attr26='2', |
| crtr_attr27='2', |
| crtr_attr28='2', |
| crtr_attr29='2', |
| crtr_attr30='2', |
| crtr_attr31='2', |
| crtr_attr32='2', |
| crtr_attr33='2', |
| crtr_attr34='2', |
| crtr_attr35='2', |
| crtr_attr36='2', |
| crtr_attr37='2', |
| crtr_attr38='2', |
| crtr_attr39='2', |
| crtr_attr40='2', |
| crtr_attr41='2', |
| crtr_attr42='2', |
| crtr_attr43='2', |
| crtr_attr44='2', |
| crtr_attr45='2', |
| crtr_attr46='2', |
| crtr_attr47='2', |
| crtr_attr48='2', |
| crtr_attr49='2', |
| crtr_attr50='2', |
| crtr_attr51='2', |
| crtr_attr52='2', |
| crtr_attr53='2', |
| crtr_attr54='2', |
| crtr_attr55='2', |
| crtr_attr56='2', |
| crtr_attr57='2', |
| crtr_attr58='2', |
| crtr_attr59='2', |
| crtr_attr60='2', |
| crtr_attr61='2', |
| crtr_attr62='2', |
| crtr_attr63='2', |
| crtr_attr64='2', |
| crtr_attr65='2', |
| crtr_attr66='2', |
| crtr_attr67='2', |
| crtr_attr68='2', |
| crtr_attr69='2', |
| crtr_attr70='2', |
| crtr_attr71='2', |
| crtr_attr72='2', |
| crtr_attr73='2', |
| crtr_attr74='2', |
| crtr_attr75='2', |
| crtr_attr76='2', |
| crtr_attr77='2', |
| crtr_attr78='2', |
| crtr_attr79='2', |
| crtr_attr80='2', |
| crtr_attr81='2', |
| crtr_attr82='2', |
| crtr_attr83='2', |
| crtr_attr84='2', |
| crtr_attr85='2', |
| crtr_attr86='2', |
| crtr_attr87='2', |
| crtr_attr88='2', |
| crtr_attr89='7', |
| crtr_attr90='7', |
| crtr_attr91='7', |
| crtr_attr92='7', |
| crtr_attr93='7', |
| crtr_attr94='7', |
| crtr_attr95='7', |
| crtr_attr96='7', |
| crtr_attr97='7', |
| crtr_attr98='7', |
| crtr_attr99='7', |
| crtr_attr100='7', |
| crtr_attr101='7', |
| crtr_attr102='7', |
| crtr_attr103='7', |
| crtr_attr104='7', |
| crtr_attr105='7', |
| crtr_attr106='7', |
| crtr_attr107='7', |
| crtr_attr108='7', |
| crtr_attr109='7', |
| crtr_attr110='7', |
| crtr_attr111='7', |
| crtr_attr112='7', |
| crtr_attr113='7', |
| crtr_attr114='7', |
| crtr_attr115='7', |
| crtr_attr116='7', |
| crtr_attr117='7', |
| crtr_attr118='7', |
| crtr_attr119='7', |
| crtr_attr120='7', |
| crtr_attr121='7', |
| crtr_attr122='7', |
| crtr_attr123='7', |
| crtr_attr124='7', |
| crtr_attr125='7', |
| crtr_attr126='7', |
| crtr_attr127='7', |
| crtr_attr128='7', |
| crtr_attr129='7', |
| crtr_attr130='7', |
| crtr_attr131='7', |
| crtr_attr132='7', |
| crtr_attr133='7', |
| crtr_attr134='7', |
| crtr_attr135='7', |
| crtr_attr136='7', |
| crtr_attr137='7', |
| crtr_attr138='7', |
| crtr_attr139='7', |
| crtr_attr140='7', |
| crtr_attr141='7', |
| crtr_attr142='7', |
| crtr_attr143='7', |
| crtr_attr144='7', |
| crtr_attr145='7', |
| crtr_attr146='7', |
| crtr_attr147='7', |
| crtr_attr148='7', |
| crtr_attr149='7', |
| crtr_attr150='7', |
| crtr_attr151='7', |
| crtr_attr152='7', |
| crtr_attr153='7', |
| crtr_attr154='7', |
| crtr_attr155='7', |
| crtr_attr156='7', |
| crtr_attr157='7', |
| crtr_attr158='7', |
| crtr_attr159='7', |
| crtr_attr160='7', |
| crtr_attr161='7', |
| crtr_attr162='7', |
| crtr_attr163='7', |
| crtr_attr164='7', |
| crtr_attr165='7', |
| crtr_attr166='7', |
| crtr_attr167='7', |
| crtr_attr168='7', |
| crtr_attr169='7', |
| crtr_attr170='7', |
| crtr_attr171='7', |
| crtr_attr172='7', |
| crtr_attr173='7', |
| crtr_attr174='7', |
| crtr_attr175='7', |
| crtr_attr176='7', |
| crtr_attr177='7', |
| crtr_attr178='7', |
| crtr_attr179='7', |
| ctr_attr180='7', |
| crtr_attr181='7', |
| crtr_attr182='7', |
| crtr_attr183='7', |
| crtr_attr184='7', |
| crtr_attr185='7', |
| crtr_attr186='7', |
| crtr_attr187='7',unused13='43', |
| cma_attr3746='2',unused14='51', |
| cma_attr3000='2', |
| cma_attr3001='2', |
| cma_attr3002='2', |
| cma_attr3100='2', |
| cma_attr3102='2', |
| cma_attr3104='2', |
| cma_attr3105='2', |
| cma_attr3109='2', |
| cma_attr3111='4', |
| cma_attr3113='4', |
| cma_attr3116='4', |
| cma_attr3117='4', |
| cma_attr3119='4', |
| cma_attr3120='4', |
| cma_attr3122='4', |
| cma_attr3123='4', |
| cma_attr3124='4', |
| cma_attr3126='4', |
| cma_attr3127='4', |
| cma_attr3131='4', |
| cma_attr3132='4', |
| cma_attr3133='2', |
| cma_attr3134='2', |
| cma_attr3135='2', |
| cma_attr3136='2', |
| cma_attr3137='2', |
| cma_attr3138='2', |
| cma_attr3139='2', |
| cma_attr3140='2', |
| cma_attr3141='2', |
| cma_attr3142='2', |
| cma_attr3143='2', |
| cma_attr3144='2', |
| cma_attr3145='2', |
| cma_attr3146='2', |
| cma_attr3147='2', |
| cma_attr3148='2', |
| cma_attr3150='2', |
| cma_attr3152='2', |
| cma_attr3153='2', |
| cma_attr3157='2', |
| cma_attr3159='7', |
| cma_attr3160='7', |
| cma_attr3161='7', |
| cma_attr3162='7', |
| cma_attr3163='7', |
| cma_attr3164='7', |
| cma_attr3165='7', |
| cma_attr3166='7', |
| cma_attr3167='7', |
| cma_attr3168='7', |
| cma_attr3169='7', |
| cma_attr3203='7', |
| cma_attr3204='7', |
| cma_attr3205='7', |
| cma_attr3206='7', |
| cma_attr3207='7', |
| cma_attr3208='7', |
| cma_attr3215='2', |
| cma_attr3217='2', |
| cma_attr3219='2', |
| cma_attr3223='2', |
| cma_attr3224='2', |
| cma_attr3228='7', |
| cma_attr3231='7', |
| cma_attr3234='7', |
| cma_attr3235='7', |
| cma_attr3236='7', |
| cma_attr3237='7', |
| cma_attr3239='7', |
| cma_attr3242='7', |
| cma_attr3245='7', |
| cma_attr3246='7', |
| cma_attr3257='2', |
| cma_attr3266='2', |
| cma_attr3268='2', |
| cma_attr3270='2', |
| cma_attr3272='2', |
| cma_attr3273='2', |
| cma_attr3276='2', |
| cma_attr3277='2', |
| cma_attr3285='2', |
| cma_attr3286='2', |
| cma_attr3288='2', |
| cma_attr3290='2', |
| cma_attr3292='2', |
| cma_attr3293='2', |
| cma_attr3296='2', |
| cma_attr3297='2', |
| cma_attr3307='2', |
| cma_attr3309='2', |
| cma_attr3311='2', |
| cma_attr3312='2', |
| cma_attr3315='2', |
| cma_attr3316='2', |
| cma_attr3318='2', |
| cma_attr3320='2', |
| cma_attr3322='2', |
| cma_attr3323='2', |
| cma_attr3326='2', |
| cma_attr3327='2', |
| cma_attr3329='2', |
| cma_attr3330='2', |
| cma_attr3332='2', |
| cma_attr3333='2', |
| cma_attr3335='2', |
| cma_attr3336='2', |
| cma_attr3338='2', |
| cma_attr3340='2', |
| cma_attr3347='2', |
| cma_attr3368='2', |
| cma_attr3370='2', |
| cma_attr3376='2', |
| cma_attr3379='2', |
| cma_attr3380='2', |
| cma_attr3382='2', |
| cma_attr3383='2', |
| cma_attr3385='2', |
| cma_attr3386='2', |
| cma_attr3387='2', |
| cma_attr3388='2', |
| cma_attr3389='2', |
| cma_attr3391='2', |
| cma_attr3392='2', |
| cma_attr3394='2', |
| cma_attr3395='2', |
| cma_attr3396='2', |
| cma_attr3397='2', |
| cma_attr3398='2', |
| cma_attr3400='2', |
| cma_attr3401='2', |
| cma_attr3403='2', |
| cma_attr3404='2', |
| cma_attr3405='2', |
| cma_attr3406='2', |
| cma_attr3407='2', |
| cma_attr3409='2', |
| cma_attr3410='2', |
| cma_attr3412='2', |
| cma_attr3413='2', |
| cma_attr3414='2', |
| cma_attr3415='2', |
| cma_attr3417='2', |
| cma_attr3419='2', |
| cma_attr3420='2', |
| cma_attr3422='2', |
| cma_attr3423='2', |
| cma_attr3424='2', |
| cma_attr3425='2', |
| cma_attr3426='2', |
| cma_attr3428='2', |
| cma_attr3430='2', |
| cma_attr3431='2', |
| cma_attr3433='2', |
| cma_attr3434='2', |
| cma_attr3435='2', |
| cma_attr3436='2', |
| cma_attr3437='2', |
| cma_attr3439='2', |
| cma_attr3441='2', |
| cma_attr3442='2', |
| cma_attr3444='2', |
| cma_attr3445='2', |
| cma_attr3446='2', |
| cma_attr3447='2', |
| cma_attr3448='2', |
| cma_attr3450='2', |
| cma_attr3452='2', |
| cma_attr3453='2', |
| cma_attr3455='2', |
| cma_attr3456='2', |
| cma_attr3457='2', |
| cma_attr3458='2', |
| cma_attr3535='2', |
| cma_attr3536='2', |
| cma_attr3537='2', |
| cma_attr3539='2', |
| cma_attr3540='2', |
| cma_attr3544='2', |
| cma_attr3546='2', |
| cma_attr3547='2', |
| cma_attr3548='2', |
| cma_attr3550='2', |
| cma_attr3551='2', |
| cma_attr3555='2', |
| cma_attr3557='2', |
| cma_attr3558='2', |
| cma_attr3559='2', |
| cma_attr3561='2', |
| cma_attr3562='2', |
| cma_attr3566='2', |
| cma_attr3568='2', |
| cma_attr3569='2', |
| cma_attr3570='2', |
| cma_attr3572='2', |
| cma_attr3573='2', |
| cma_attr3577='2', |
| cma_attr3579='2', |
| cma_attr3580='2', |
| cma_attr3592='2', |
| cma_attr3593='2', |
| cma_attr3594='2', |
| cma_attr3596='2', |
| cma_attr3597='2', |
| cma_attr3598='2', |
| cma_attr3600='2', |
| cma_attr3601='2', |
| cma_attr3602='2', |
| cma_attr3603='2', |
| cma_attr3605='2', |
| cma_attr3607='2', |
| cma_attr3608='2', |
| cma_attr3611='2', |
| cma_attr3612='2', |
| cma_attr3723='2', |
| cma_attr3724='2', |
| cma_attr3725='2', |
| cma_attr3726='2', |
| cma_attr3727='2', |
| cma_attr3728='2', |
| cma_attr3729='2', |
| cma_attr3900='5', |
| cma_attr3901='5', |
| cma_attr3902='1', |
| cma_attr3903='1', |
| cma_attr3904='1', |
| cma_attr3905='1', |
| cma_attr3907='2', |
| cma_attr3908='2', |
| cma_attr3909='2', |
| cma_attr3911='7', |
| cma_attr3912='7', |
| cma_attr3913='7', |
| cma_attr3747='2', |
| cma_attr3748='2', |
| cma_attr3749='2', |
| cma_attr3750='2', |
| cma_attr3751='2', |
| cma_attr3752='2', |
| cma_attr3753='2', |
| cma_attr3754='2', |
| cma_attr3812='4', |
| cma_attr3813='4', |
| cma_attr3993='5', |
| cma_attr3994='5', |
| cma_attr3995='5', |
| cma_attr3825='5', |
| cma_attr3826='5', |
| cma_attr3827='5', |
| cma_attr3828='5', |
| cma_attr3829='5', |
| cma_attr3830='5', |
| cma_attr3831='5', |
| cma_attr3832='5', |
| cma_attr3833='5', |
| cma_attr3834='5', |
| cma_attr3835='5', |
| cma_attr3836='5', |
| cma_attr3837='5', |
| cma_attr3838='5', |
| cma_attr3839='5', |
| cma_attr3840='5', |
| cma_attr3841='5', |
| cma_attr3842='5', |
| cma_attr3843='5', |
| cma_attr3844='5', |
| cma_attr3845='5', |
| cma_attr3854='5', |
| cma_attr3855='5', |
| cma_attr3856='5', |
| cma_attr3857='5', |
| cma_attr3858='5', |
| cma_attr3859='5', |
| cma_attr3860='5', |
| cma_attr3861='5', |
| cma_attr3862='5', |
| cma_attr3863='5', |
| cma_attr3864='5', |
| cma_attr3865='5', |
| cma_attr3866='5', |
| cma_attr3867='5', |
| cma_attr3868='5', |
| cma_attr3869='5', |
| cma_attr3938='5', |
| cma_attr3939='5', |
| cma_attr3940='5', |
| cma_attr3870='2', |
| cma_attr3871='2', |
| cma_attr3872='2', |
| cma_attr3873='2', |
| cma_attr3874='2', |
| cma_attr3875='2', |
| cma_attr3876='2', |
| cma_attr3877='2', |
| cma_attr3878='2', |
| cma_attr3879='2', |
| cma_attr3880='2', |
| cma_attr3881='2', |
| cma_attr3882='2', |
| cma_attr3883='2', |
| cma_attr3884='2', |
| cma_attr3885='2', |
| cma_attr3917='2', |
| cma_attr3918='2', |
| cma_attr3919='2', |
| cma_attr3920='2', |
| cma_attr3921='2', |
| cma_attr3922='2', |
| cma_attr3923='2', |
| cma_attr3924='2', |
| cma_attr3925='2', |
| cma_attr3926='2', |
| cma_attr3927='2', |
| cma_attr3928='2', |
| cma_attr3929='2', |
| cma_attr3930='2', |
| cma_attr3931='2', |
| cma_attr3932='2', |
| cma_attr3933='2', |
| cma_attr3886='2', |
| cma_attr3934='2', |
| cma_attr3887='2', |
| cma_attr3894='5', |
| cma_attr3895='5', |
| cma_attr3896='5', |
| cma_attr3897='5', |
| cma_attr3898='5', |
| cma_attr3899='5', |
| cma_attr3914='5', |
| cma_attr3915='5', |
| cma_attr3916='5', |
| cma_attr3941='5', |
| cma_attr3942='5', |
| cma_attr3943='5', |
| cma_attr3944='5', |
| cma_attr3945='5', |
| cma_attr3946='5', |
| cma_attr3947='5', |
| cma_attr3948='5', |
| cma_attr3949='5', |
| cma_attr3950='2', |
| cma_attr3951='2', |
| cma_attr3952='2', |
| cma_attr3953='2', |
| cma_attr3954='2', |
| cma_attr3955='2', |
| cma_attr3956='2', |
| cma_attr3957='2', |
| cma_attr3958='2', |
| cma_attr3959='2', |
| cma_attr3960='2', |
| cma_attr3961='2', |
| cma_attr3962='2', |
| cma_attr3963='2', |
| cma_attr3964='2', |
| cma_attr3968='5', |
| cma_attr3969='5', |
| cma_attr3970='5', |
| cma_attr3971='5', |
| cma_attr3973='5', |
| cma_attr3974='5', |
| cma_attr3975='5', |
| cma_attr3976='5', |
| cma_attr3978='5', |
| cma_attr3979='5', |
| cma_attr3980='5', |
| cma_attr3981='5', |
| cma_attr3983='5', |
| cma_attr3984='5', |
| cma_attr3985='5', |
| cma_attr3986='5', |
| cma_attr3987='5', |
| unused15='1', |
| census_tract_2010='6', |
| unused16='1', |
| census_block_2010='4', |
| unused17='1', |
| county_code_2010='3', |
| unused18='1', |
| preserve_blanks=on, |
| NULL=' ', |
| line_delim=E'\n' |
| ) |
| ; |
| drop external table large_custom_format_definitions; |
| |
| -- Incomplete external data file |
| CREATE OR REPLACE FUNCTION gpformatter() RETURNS record |
| AS '$libdir/gpformatter.so', 'formatter_import' |
| LANGUAGE C STABLE; |
| DROP EXTERNAL TABLE IF EXISTS tbl_ext_gpformatter; |
| CREATE READABLE EXTERNAL TABLE tbl_ext_gpformatter ( |
| d1 text |
| ) |
| LOCATION ( |
| 'file://@hostname@@abs_srcdir@/data/incomplete_formatter_data.tbl' |
| ) |
| FORMAT 'CUSTOM' (formatter='gpformatter'); |
| |
| SELECT * FROM tbl_ext_gpformatter; |
| |
| |
| -- |
| -- Test information_schema views for external tables |
| -- |
| SELECT * FROM information_schema.tables WHERE table_name IN ('wet_pos4', 'exttab_basic_1'); |
| |
| -- |
| -- Test external table can be safely expanded |
| -- |
| |
| -- start_ignore |
| create extension if not exists gp_debug_numsegments; |
| -- end_ignore |
| |
| select gp_debug_set_create_table_default_numsegments(2); |
| |
| create writable external table ext_w_expand(a text, b text) location('gpfdist://foo:7070/ext_w_expand.out') format 'text'; |
| |
| select numsegments from gp_distribution_policy where localoid = 'ext_w_expand'::regclass; |
| |
| alter external table ext_w_expand expand table; |
| |
| select numsegments from gp_distribution_policy where localoid = 'ext_w_expand'::regclass; |
| |
| drop external table ext_w_expand; |
| |
| select gp_debug_reset_create_table_default_numsegments(); |
| |
| -- |
| -- Test host name cannot be resolved |
| -- |
| CREATE READABLE EXTERNAL TABLE ext_invalid_host() LOCATION ('gpfdist://not-exist-host/data.csv') FORMAT 'CSV' ( DELIMITER AS ','); |
| |
| SELECT * from ext_invalid_host; |
| |
| -- Test delimiter off |
| |
| CREATE EXTERNAL TABLE test_delimiter(data text) LOCATION('gpfdist://127.0.0.1/test_delimiter.txt') FORMAT 'text' (DELIMITER 'off'); |
| |
| DROP EXTERNAL TABLE test_delimiter; |
| |
| -- Test multiple character delimiter |
| |
| CREATE EXTERNAL TABLE test_delimiter(data text) LOCATION('gpfdist://127.0.0.1/test_delimiter.txt') FORMAT 'csv' (DELIMITER 'ab'); |
| |
| -- Test notice reject message when execute on coordinator |
| |
| CREATE EXTERNAL WEB TABLE web_exec_on_coordinator_with_err_limit (c1 int) EXECUTE 'for i in `seq 1 2`; do echo 1 3;done; echo 22' ON COORDINATOR FORMAT 'TEXT' SEGMENT REJECT LIMIT 3; |
| |
| SELECT * FROM web_exec_on_coordinator_with_err_limit; |
| |
| DROP EXTERNAL TABLE web_exec_on_coordinator_with_err_limit; |
| |
| -- Test notice reject message when execute on coordinator with multiple commands |
| |
| CREATE EXTERNAL WEB TABLE web_exec_on_coordinator_with_multiple_commands (c1 int) EXECUTE 'for i in `seq 1 `; do echo 2 1; |
| done; echo 2 ; echo 1 2; echo 2; echo 3 4' ON COORDINATOR FORMAT 'TEXT' SEGMENT REJECT LIMIT 6; |
| |
| SELECT * FROM web_exec_on_coordinator_with_multiple_commands; |
| |
| DROP EXTERNAL TABLE web_exec_on_coordinator_with_multiple_commands; |
| |
| -- Test notice reject message when execute on segments with multiple commands |
| |
| CREATE EXTERNAL WEB TABLE web_exec_on_segments_with_multiple_commands (c1 int) EXECUTE 'for i in `seq 1 `; do echo 2 1; |
| done; echo 2 ; echo 1 2; echo 2; echo 3 4' FORMAT 'TEXT' SEGMENT REJECT LIMIT 6; |
| |
| SELECT * FROM web_exec_on_segments_with_multiple_commands; |
| |
| DROP EXTERNAL TABLE web_exec_on_segments_with_multiple_commands; |
| |
| -- Test reject number reached when execute on coordinator |
| |
| CREATE EXTERNAL WEB TABLE web_exec_on_coordinator_with_err_limit_reached (c1 int) EXECUTE 'for i in `seq 1 3`; do echo 1 3;done; echo 22' ON COORDINATOR FORMAT 'TEXT' SEGMENT REJECT LIMIT 3; |
| |
| SELECT * FROM web_exec_on_coordinator_with_err_limit_reached; |
| |
| DROP EXTERNAL TABLE web_exec_on_coordinator_with_err_limit_reached; |
| |
| -- Test re-scan the external tables in a subplan |
| |
| CREATE EXTERNAL WEB TABLE ext_subplan_t1(c1 int) EXECUTE'seq 1 5' ON MASTER FORMAT 'text'; |
| CREATE EXTERNAL WEB TABLE ext_subplan_t2(c1 int) EXECUTE'seq 1 10' ON MASTER FORMAT 'text'; |
| |
| EXPLAIN SELECT |
| c1, |
| ( |
| SELECT c1 |
| FROM ext_subplan_t2 |
| WHERE ext_subplan_t2.c1 = ext_subplan_t1.c1 |
| LIMIT 1 |
| ) |
| FROM ext_subplan_t1; |
| |
| SELECT |
| c1, |
| ( |
| SELECT c1 |
| FROM ext_subplan_t2 |
| WHERE ext_subplan_t2.c1 = ext_subplan_t1.c1 |
| LIMIT 1 |
| ) |
| FROM ext_subplan_t1; |
| |
| DROP EXTERNAL TABLE ext_subplan_t1; |
| DROP EXTERNAL TABLE ext_subplan_t2; |
| |
| -- Test external tables as partitions, and gpcheckcat |
| CREATE TABLE test_part_integrity(a int, b int) PARTITION BY LIST (a) DISTRIBUTED BY (a); |
| CREATE TABLE test_part_integrity_p1(a int, b int) DISTRIBUTED BY (a); |
| INSERT INTO test_part_integrity_p1 VALUES (1,2),(1,3); |
| CREATE EXTERNAL WEB TABLE test_part_integrity_p2 (LIKE test_part_integrity_p1) EXECUTE 'echo 2,2;echo 2,3' ON MASTER FORMAT 'CSV'; |
| ALTER TABLE test_part_integrity ATTACH PARTITION test_part_integrity_p1 FOR VALUES IN (1); |
| ALTER TABLE test_part_integrity ATTACH PARTITION test_part_integrity_p2 FOR VALUES IN (2); |
| SELECT * FROM test_part_integrity; |
| |
| DROP TABLE test_part_integrity; |
| |
| -- Testing creating external table with replicated distribution |
| -- Should report error |
| CREATE WRITABLE EXTERNAL WEB TABLE ext_dist_repl(a int, b int) EXECUTE 'some command' FORMAT 'TEXT' DISTRIBUTED REPLICATED; |
| |
| -- Testing altering the distribution policy of external tables. |
| CREATE WRITABLE EXTERNAL WEB TABLE ext_w_dist(a int, b int) EXECUTE 'cat > @abs_srcdir@/data/ext_w_dist.tbl' FORMAT 'TEXT' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ') DISTRIBUTED BY (a); |
| ALTER TABLE ext_w_dist SET WITH (reorganize=true); -- should error out if forcing reorganize |
| SELECT policytype, distkey FROM gp_distribution_policy WHERE localoid = 'ext_w_dist'::regclass; |
| ALTER TABLE ext_w_dist SET DISTRIBUTED BY (b); |
| SELECT policytype, distkey FROM gp_distribution_policy WHERE localoid = 'ext_w_dist'::regclass; |
| ALTER TABLE ext_w_dist SET DISTRIBUTED RANDOMLY; |
| SELECT policytype, distkey FROM gp_distribution_policy WHERE localoid = 'ext_w_dist'::regclass; |
| ALTER TABLE ext_w_dist SET DISTRIBUTED REPLICATED; -- ERROR |
| CREATE EXTERNAL WEB TABLE ext_r_dist(a int) EXECUTE 'printf ${GP_SEGMENT_ID}' FORMAT 'TEXT' DISTRIBUTED BY (a); |
| CREATE EXTERNAL WEB TABLE ext_r_dist(a int) EXECUTE 'printf ${GP_SEGMENT_ID}' FORMAT 'TEXT'; |
| ALTER TABLE ext_r_dist SET DISTRIBUTED BY (a); -- should error out altering readable external tables' distribution policy |
| |
| -- Testing external table as the partition child. |
| CREATE TABLE part_root(a int) PARTITION BY RANGE(a); |
| CREATE TABLE part_child (LIKE part_root); |
| CREATE EXTERNAL WEB TABLE part_ext_r(a int) EXECUTE 'cat > @abs_srcdir@/data/part_ext.tbl' FORMAT 'TEXT' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' '); |
| CREATE WRITABLE EXTERNAL WEB TABLE part_ext_w(a int, b int) EXECUTE 'cat > @abs_srcdir@/data/part_ext.tbl' FORMAT 'TEXT' (DELIMITER AS '|' NULL AS 'null' ESCAPE AS ' ') DISTRIBUTED BY (a); |
| ALTER TABLE part_root ATTACH PARTITION part_child FOR VALUES FROM (0) TO (10); |
| ALTER TABLE part_root ATTACH PARTITION part_ext_r FOR VALUES FROM (10) TO (20); |
| |
| -- Adding column on readable external table should work fine |
| ALTER TABLE part_root ADD COLUMN b int; |
| |
| -- altering distribution policy on writable external table should work fine |
| SELECT policytype, distkey FROM gp_distribution_policy WHERE localoid = 'part_ext_w'::regclass; |
| ALTER TABLE part_ext_w SET DISTRIBUTED BY (b); |
| SELECT policytype, distkey FROM gp_distribution_policy WHERE localoid = 'part_ext_w'::regclass; |
| |
| DROP TABLE part_root; |
| |
| -- check logerrors value of pg_exttable |
| CREATE EXTERNAL TABLE ext_false (c INT) |
| location ('file://@hostname@@abs_srcdir@/data/ext_fasle.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| CREATE EXTERNAL TABLE ext_true (c INT) |
| location ('file://@hostname@@abs_srcdir@/data/ext_true.tbl' ) |
| FORMAT 'text' (delimiter '|') LOG ERRORS SEGMENT REJECT LIMIT 100; |
| CREATE EXTERNAL TABLE ext_persistently (c INT) |
| location ('file://@hostname@@abs_srcdir@/data/ext_persistently.tbl' ) |
| FORMAT 'text' (delimiter '|') LOG ERRORS PERSISTENTLY SEGMENT REJECT LIMIT 100; |
| |
| SELECT logerrors, options from pg_exttable a, pg_class b where a.reloid = b.oid and b.relname = 'ext_false'; |
| SELECT logerrors, options from pg_exttable a, pg_class b where a.reloid = b.oid and b.relname = 'ext_true'; |
| SELECT logerrors, options from pg_exttable a, pg_class b where a.reloid = b.oid and b.relname = 'ext_persistently'; |
| |
| -- drop tables |
| DROP EXTERNAL TABLE ext_false; |
| DROP EXTERNAL TABLE ext_true; |
| DROP EXTERNAL TABLE ext_persistently; |