| -- |
| -- external tables 1 - short and simple functional tests. The full set of tests |
| -- exists in cdbunit. |
| -- |
| -- 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 cannot open - solaris |
| -- m/ERROR\:\s+external table .* command ended with .*cat\: cannot open.*/i |
| -- s/cat\: cannot open (.*)$/cat\: $1\: NO SUCH FILE/ |
| -- |
| -- end_matchsubs |
| SET gp_foreign_data_access = true; |
| set optimizer_disable_missing_stats_collection = on; |
| CREATE TABLE REG_REGION (R_REGIONKEY INT, R_NAME CHAR(25), R_COMMENT VARCHAR(152)) DISTRIBUTED BY (R_REGIONKEY); |
| |
| -- start_ignore |
| -- -------------------------------------- |
| -- check platform |
| -- -------------------------------------- |
| drop external web table if exists check_echo; |
| CREATE EXTERNAL WEB TABLE check_echo (x text) |
| execute E'(echo gpfdist)' |
| on SEGMENT 0 |
| format 'text'; |
| select * from check_echo; |
| |
| |
| -- end_ignore |
| |
| |
| -- -------------------------------------- |
| -- 'gpfdist' protocol |
| -- -------------------------------------- |
| |
| CREATE EXTERNAL WEB TABLE gpfdist_status (x text) |
| execute E'( python $GPHOME/bin/lib/gppinggpfdist.py @hostname@:7070 2>&1 || echo) ' |
| on SEGMENT 0 |
| FORMAT 'text' (delimiter '|'); |
| |
| CREATE EXTERNAL WEB TABLE gpfdist_start (x text) |
| execute E'((@gpwhich_gpfdist@ -p 7070 -d @abs_srcdir@/data </dev/null >/dev/null 2>&1 &); sleep 2; echo "starting...") ' |
| on SEGMENT 0 |
| FORMAT 'text' (delimiter '|'); |
| |
| CREATE EXTERNAL WEB TABLE gpfdist_stop (x text) |
| execute E'(/bin/pkill gpfdist || killall gpfdist) > /dev/null 2>&1; echo "stopping..."' |
| on SEGMENT 0 |
| FORMAT 'text' (delimiter '|'); |
| |
| -- start_ignore |
| select * from gpfdist_stop; |
| select * from gpfdist_status; |
| select * from gpfdist_start; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| CREATE EXTERNAL TABLE EXT_NATION ( N_NATIONKEY INTEGER , |
| N_NAME CHAR(25) , |
| N_REGIONKEY INTEGER , |
| N_COMMENT VARCHAR(152)) |
| location ('gpfdist://@hostname@:7070/nation.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| CREATE EXTERNAL TABLE EXT_REGION (LIKE REG_REGION) |
| location ('gpfdist://@hostname@:7070/region.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| |
| SELECT * FROM EXT_NATION; |
| SELECT * FROM EXT_REGION; |
| SELECT * FROM EXT_REGION as r, EXT_NATION as n WHERE n.N_REGIONKEY = r.R_REGIONKEY; |
| |
| -- start_ignore |
| select * from gpfdist_status; |
| select * from gpfdist_stop; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| -- drop tables |
| DROP EXTERNAL TABLE EXT_NATION; |
| DROP EXTERNAL TABLE EXT_REGION; |
| |
| -- |
| -- gpfdist in csv (mpp-1519, etc) |
| -- |
| CREATE EXTERNAL WEB TABLE gpfdist_csv_start (x text) |
| execute E'((@gpwhich_gpfdist@ -p 7070 -d @abs_srcdir@/data </dev/null >/dev/null 2>&1 &); sleep 2; echo "starting...") ' |
| on SEGMENT 0 |
| FORMAT 'text' (delimiter '|'); |
| -- |
| -- " |
| -- (end the double quote so emacs highlighting works correctly) |
| -- |
| -- start_ignore |
| select * from gpfdist_status; |
| select * from gpfdist_stop; |
| select * from gpfdist_status; |
| select * from gpfdist_csv_start; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| create external table ext_whois ( |
| source_lineno int, |
| domain_name varchar(350), |
| subdomain varchar(150), |
| tld varchar(50), |
| ip_address inet, |
| ip_address_int bigint, |
| reverse_dns varchar(512), |
| reverse_domain varchar(350), |
| registrar varchar(200), |
| registrar_referral varchar(512), |
| whois_server varchar(512), |
| harvest_date timestamp with time zone, |
| created_on timestamp with time zone, |
| update_date timestamp with time zone, |
| expire_date timestamp with time zone, |
| rank int, |
| status char(1), |
| update_status int, |
| nameserver1 varchar(512), |
| nameserver1_domain_name varchar(350), |
| nameserver1_subdomain varchar(150), |
| nameserver1_tld varchar(50), |
| nameserver2 varchar(512), |
| nameserver2_domain_name varchar(350), |
| nameserver2_subdomain varchar(150), |
| nameserver2_tld varchar(50), |
| nameserver3 varchar(512), |
| nameserver3_domain_name varchar(350), |
| nameserver3_subdomain varchar(150), |
| nameserver3_tld varchar(50), |
| nameserver4 varchar(512), |
| nameserver4_domain_name varchar(350), |
| nameserver4_subdomain varchar(150), |
| nameserver4_tld varchar(50), |
| nameserver5 varchar(512), |
| nameserver5_domain_name varchar(350), |
| nameserver5_subdomain varchar(150), |
| nameserver5_tld varchar(50), |
| registrant_name varchar(200), |
| registrant_organization varchar(200), |
| registrant_email varchar(512), |
| registrant_email_domain varchar(350), |
| registrant_email_subdomain varchar(150), |
| registrant_email_tld varchar(50), |
| registrant_phone varchar(50), |
| registrant_fax varchar(50), |
| registrant_addrall varchar(1024), |
| registrant_street1 varchar(200), |
| registrant_street2 varchar(200), |
| registrant_street3 varchar(200), |
| registrant_city varchar(200), |
| registrant_state_province varchar(100), |
| registrant_postal_code varchar(50), |
| registrant_country varchar(100), |
| tech_name varchar(200), |
| tech_organization varchar(200), |
| tech_email varchar(512), |
| tech_email_domain varchar(350), |
| tech_email_subdomain varchar(150), |
| tech_email_tld varchar(50), |
| tech_phone varchar(50), |
| tech_fax varchar(50), |
| tech_addrall varchar(1024), |
| tech_street1 varchar(200), |
| tech_street2 varchar(200), |
| tech_street3 varchar(200), |
| tech_city varchar(200), |
| tech_state_province varchar(100), |
| tech_postal_code varchar(50), |
| tech_country varchar(100), |
| admin_name varchar(200), |
| admin_organization varchar(200), |
| admin_email varchar(512), |
| admin_email_domain varchar(350), |
| admin_email_subdomain varchar(150), |
| admin_email_tld varchar(50), |
| admin_phone varchar(50), |
| admin_fax varchar(50), |
| admin_addrall varchar(1024), |
| admin_street1 varchar(200), |
| admin_street2 varchar(200), |
| admin_street3 varchar(200), |
| admin_city varchar(200), |
| admin_state_province varchar(100), |
| admin_postal_code varchar(50), |
| admin_country varchar(100), |
| rec_path varchar(512), |
| raw_record text |
| ) |
| location ('gpfdist://@hostname@:7070/whois.csv' ) |
| format 'csv' ( quote as '"' header); |
| -- " |
| -- start_ignore |
| select count(*) from ext_whois; |
| -- end_ignore |
| |
| -- test FILL EMPTY FIELDS |
| create external table ext_fill1(a int, b int, c int) |
| location('gpfdist://@hostname@:7070/missing_fields1.data' ) |
| format 'text' ( delimiter '|' fill missing fields); |
| |
| create external table ext_fill2(a int, b int, c int) |
| location('gpfdist://@hostname@:7070/missing_fields2.data' ) |
| format 'text' ( delimiter '|' fill missing fields); |
| |
| -- also test force not null in addition to fill empty fields |
| create external table ext_fill3_fnn(a text, b text, c text) |
| location('gpfdist://@hostname@:7070/missing_fields1.data' ) |
| format 'csv' ( delimiter '|' fill missing fields force not null c); |
| |
| create external table ext_fill4_fnn(a text, b text, c text) |
| location('gpfdist://@hostname@:7070/missing_fields1.data' ) |
| format 'csv' ( delimiter '|' fill missing fields force not null b,c); |
| |
| select * from ext_fill1 order by a,b,c; -- should pad missing attrs with nulls |
| -- start_ignore |
| select * from ext_fill2 order by a,b,c; -- should fail due to empty data line |
| -- end_ignore |
| select * from ext_fill3_fnn where c is null; -- should be empty |
| select * from ext_fill3_fnn where b is null; -- one row result |
| select * from ext_fill4_fnn where c is null or b is null; -- should be empty |
| |
| drop external table ext_fill1; |
| drop external table ext_fill2; |
| drop external table ext_fill3_fnn; |
| drop external table ext_fill4_fnn; |
| |
| -- test NEWLINE |
| create external table ext_newline1(N_NATIONKEY INT, N_NAME text, N_REGIONKEY INT, N_COMMENT text) |
| location('gpfdist://@hostname@:7070/nation.tbl' ) |
| format 'text' ( delimiter '|' newline 'lf'); |
| |
| create external table ext_newline2(like ext_newline1) |
| location('gpfdist://@hostname@:7070/nation.tbl' ) |
| format 'text' ( delimiter '|' newline 'cr'); |
| |
| create external table ext_willfail(a int) |
| location('gpfdist://@hostname@:7070/nation.tbl' ) |
| format 'text' ( delimiter '|' newline 'blah'); -- should fail with invalid newline. |
| |
| select * from ext_newline1; -- should pass. using the correct linefeed. file has 'lf'. |
| -- start_ignore |
| select * from ext_newline2; -- should fail. using an incorrect linefeed. file has 'lf'. |
| -- end_ignore |
| |
| drop external table ext_newline1; |
| drop external table ext_newline2; |
| |
| -- MPP-6698 |
| create external table ext_mpp6698(a text) |
| location('gpfdist://@hostname@:7070/mpp6698.data' ) |
| format 'csv' (quote ''''); |
| |
| select * from ext_mpp6698 order by a; -- should ignore the quotes |
| drop external table ext_mpp6698; |
| |
| -- MPP-12839 |
| create external table ext_mpp12839 |
| ( |
| userguid varchar(36), |
| action_time timestamp without time zone, |
| action_type smallint, |
| object_id integer, |
| general_param character varying(8000), |
| plu_id smallint, |
| page_name character varying(2000), |
| browser integer, |
| platform integer, |
| filtering_data character varying(8000), |
| is_new_user boolean, |
| dummy character varying(1) |
| ) |
| location('gpfdist://@hostname@:7070/mpp12839*.data' ) |
| format 'text' (delimiter E'\177' null '' newline 'crlf') |
| segment reject limit 100 rows; |
| |
| select * from ext_mpp12839; -- should not reach reject limit |
| drop external table ext_mpp12839; |
| |
| -- -------------------------------------- |
| -- some negative tests |
| -- -------------------------------------- |
| |
| -- |
| -- test for exec child process stderr showing in error message |
| -- |
| create external web table ext_stderr1(a text) execute 'nosuchcommand' ON 0 format 'text'; |
| create external web table ext_stderr2(a text) execute 'cat nosuchfile.txt' ON 0 format 'text'; |
| |
| -- |
| -- bad csv (quote must be a single char) |
| -- |
| create external table bad_whois ( |
| source_lineno int, |
| domain_name varchar(350) |
| ) |
| location ('gpfdist://@hostname@:7070/whois.csv' ) |
| format 'csv' ( header quote as 'ggg'); |
| select count(*) from bad_whois; |
| drop external table bad_whois; |
| |
| -- |
| -- 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 |
| -- |
| --create external table ext (a int, x text) |
| --location ('gpfdist://@hostname@:7070@abs_srcdir@/data/no/such/place/badt1.tbl' ) |
| --format 'text'; |
| --alter foreign table ext drop column a; -- should fail (wrong object) |
| --alter table ext drop column a; -- should pass with warning |
| --alter external table ext add column a int; |
| --alter external table ext drop column a; |
| --alter external table ext add column extnewcol int not null; -- should fail (constraints not allowed) |
| --alter external table ext add column extnewcol int; |
| --alter external table ext alter column extnewcol set default 1; -- should fail (unsupported alter type) |
| |
| -- |
| -- TRUNCATE/UPDATE/DELETE/INSERT (INTO RET) |
| -- |
| --truncate ext; |
| --delete from ext; |
| --update ext set x='1' where x='2'; |
| --insert into ext(x) values('a'); |
| --drop table ext; -- should fail (wrong object) |
| --drop foreign 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; |
| -- CREATE OR REPLACE FUNCTION read_from_file() RETURNS integer as '$libdir/gpextprotocol.so', 'demoprot_import' LANGUAGE C STABLE; |
| |
| -- 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 |
| |
| -- 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; |
| -- SET SESSION AUTHORIZATION extprotu; |
| |
| -- CREATE WRITABLE EXTERNAL TABLE ext_w(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should succeed |
| -- CREATE READABLE EXTERNAL TABLE ext_r(a int) location('demoprot://demoprotfile.txt') format 'text'; -- should succeed |
| -- 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; |
| |
| -- |
| -- WET tests |
| -- |
| |
| -- |
| -- CREATE (including LIKE, DISTRIBUTED BY) |
| -- |
| -- positive |
| create writable external table wet_pos1(a text, b text) location('gpfdist://@hostname@:7070/wet.out') format 'text'; |
| create writable external table wet_pos2(a text, b text) location('gpfdist://@hostname@:7070/wet.out') format 'text' distributed by(b); |
| create writable external table wet_pos3(like wet_pos2) location('gpfdist://@hostname@:7070/wet.out') format 'text' distributed by(a,b); |
| create writable external table wet_region(like reg_region) location('gpfdist://@hostname@:7070/wet_region.out') format 'text'; |
| create readable external table ret_region(like wet_region) location('gpfdist://@hostname@:7070/wet_region.out') format 'text'; |
| |
| -- negative |
| create writable external table wet_neg1(a text, b text) location('gpfdist://@hostname@:7070@abs_srcdir@/badt1.tbl') format 'text'; |
| create writable external table wet_neg1(a text, b text) location('gpfdist://@hostname@:7070/wet.out', 'gpfdist://@hostname@:7070/wet.out') format 'text'; |
| create writable external web table wet_pos5(a text, b text) execute 'some command' on segment 0 format 'text'; |
| |
| -- |
| -- SELECT from WET (negative) |
| -- |
| select * from wet_pos1; |
| -- |
| -- WET: export some data with INSERT SELECT, INSERT and COPY. |
| -- |
| -- COPY reg_region FROM STDIN DELIMITER '|'; |
| -- 0|AFRICA|lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to |
| -- 1|AMERICA|hs use ironic, even requests. s |
| -- \. |
| INSERT INTO wet_region SELECT * from reg_region; |
| |
| -- COPY wet_region FROM STDIN DELIMITER '|'; |
| -- 2|ASIA|ges. thinly even pinto beans ca |
| -- 3|EUROPE|ly final courts cajole furiously final excuse |
| -- \. |
| -- INSERT INTO wet_region VALUES(4,'MIDDLE EAST','uickly special'); |
| |
| -- |
| -- Now use RET to see if data was exported correctly. |
| -- NOTE: since we don't bother cleaning up the exported file, it may grow bigger |
| -- in between runs, so we don't check for count(*), and instead check for distinct. |
| -- |
| -- SELECT DISTINCT(R_NAME) FROM ret_region ORDER BY R_NAME; |
| |
| -- start_ignore |
| select * from gpfdist_status; |
| select * from gpfdist_stop; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| -- |
| -- get an error for missing gpfdist |
| -- |
| select count(*) from ext_whois; |
| |
| -- |
| -- test CREATE EXTERNAL TABLE privileges |
| -- |
| -- show gp_external_grant_privileges; -- MUST BE OFF for the following tests to work. |
| -- CREATE ROLE exttab1_su SUPERUSER; -- SU with no privs in pg_auth |
| -- CREATE ROLE exttab1_u1 CREATEEXTTABLE(protocol='gpfdist', type='readable'); |
| -- CREATE ROLE exttab1_u2 CREATEEXTTABLE(protocol='gpfdist', type='writable'); |
| -- CREATE ROLE exttab1_u3 CREATEEXTTABLE(protocol='gpfdist') NOCREATEEXTTABLE(protocol='gpfdist', type='readable'); -- fail due to conflict |
| |
| -- SET SESSION AUTHORIZATION exttab1_su; |
| -- create readable external table auth_ext_test1(a int) location ('gpfdist://host:8000/file') format 'text'; |
| -- SET SESSION AUTHORIZATION exttab1_u1; |
| -- create readable external table auth_ext_test2(a int) location ('gpfdist://host:8000/file') format 'text'; |
| -- create writable external table auth_ext_test3(a int) location ('gpfdist://host:8000/file') format 'text'; -- fail |
| -- SET SESSION AUTHORIZATION exttab1_u2; |
| -- create writable external table auth_ext_test3(a int) location ('gpfdist://host:8000/file') format 'text'; |
| -- RESET SESSION AUTHORIZATION; |
| -- ALTER ROLE exttab1_u2 NOCREATEEXTTABLE(protocol='gpfdist', type='writable'); |
| -- SET SESSION AUTHORIZATION exttab1_u2; |
| -- create writable external table auth_ext_test4(a int) location ('gpfdist://host:8000/file') format 'text'; -- fail |
| -- RESET SESSION AUTHORIZATION; |
| |
| -- drop external table auth_ext_test1; |
| -- drop external table auth_ext_test2; |
| -- drop external table auth_ext_test3; |
| |
| -- DROP ROLE exttab1_su; |
| -- DROP ROLE exttab1_u1; |
| -- DROP ROLE exttab1_u2; |
| |
| drop external table ext_whois; |
| drop external table gpfdist_csv_start; |
| drop external table check_echo; |
| drop external table wet_pos1; |
| drop external table wet_pos2; |
| drop external table wet_pos3; |
| drop external table wet_region; |
| drop external table ret_region; |
| drop table reg_region; |
| |
| -- Tests for MPP-2513: dropping an external table must result in the deletion |
| -- of the relation pg_exttable row. This was done when using drop external |
| -- table but not drop schema cascade; |
| |
| create schema exttabletest; |
| CREATE EXTERNAL TABLE exttabletest.EXT_NATION ( N_NATIONKEY INTEGER , |
| N_NAME CHAR(25) , |
| N_REGIONKEY INTEGER , |
| N_COMMENT VARCHAR(152)) |
| location ('gpfdist://host:8000/nation.tbl' ) |
| FORMAT 'text' (delimiter '|'); |
| -- Don't just return the row, as we'll get skew from OID differences between |
| -- runs. |
| select count(*) from pg_catalog.pg_exttable where reloid in (select r.oid from pg_class r where r.relname in ('ext_nation', 'ext_whois', 'gpfdist_status')); |
| drop schema exttabletest cascade; |
| select count(*) from pg_catalog.pg_exttable where reloid in (select r.oid from pg_class r where r.relname in ('ext_nation', 'ext_whois', 'gpfdist_status')); |
| SET gp_foreign_data_access = false; |
| |
| CREATE USER nonsuperproto; |
| GRANT SELECT ON PROTOCOL pxf TO nonsuperproto; |
| GRANT INSERT ON PROTOCOL pxf TO nonsuperproto; |
| REVOKE SELECT ON PROTOCOL pxf FROM nonsuperproto; |
| REVOKE INSERT ON PROTOCOL pxf FROM nonsuperproto; |
| DROP USER nonsuperproto; |
| |
| -- start_ignore |
| select * from gpfdist_status; |
| select * from gpfdist_start; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| -- Tests for MPP17980: generating artificial CTIDs for external table scans |
| -- This is necessary because the planner currently generates plans that include |
| -- the CTID attribute for external tables. |
| |
| CREATE EXTERNAL TABLE ext_mpp17980 ( id int , id1 int , id2 int) |
| LOCATION ('gpfdist://@hostname@:7070/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; |
| |
| -- start_ignore |
| select * from gpfdist_status; |
| select * from gpfdist_stop; |
| select * from gpfdist_status; |
| -- end_ignore |
| |
| drop external table gpfdist_status; |
| drop external table gpfdist_start; |
| drop external table gpfdist_stop; |