ustore存储引擎的regression用例12

This commit is contained in:
zhaosen
2024-05-10 11:43:46 +08:00
committed by yaoxin
parent ec70b01e7a
commit 6a0db2cb34
2 changed files with 553 additions and 0 deletions

View File

@ -0,0 +1,323 @@
-- Enforce use of COMMIT instead of 2PC for temporary objects
CREATE TABLE x (
a int,
b int,
c text not null default 'stuff',
d text,
e text
) with (storage_type = ustore);
CREATE FUNCTION fn_x_before () RETURNS TRIGGER AS '
BEGIN
NEW.e := ''before trigger fired''::text;
return NEW;
END;
' LANGUAGE plpgsql;
CREATE FUNCTION fn_x_after () RETURNS TRIGGER AS '
BEGIN
UPDATE x set e=''after trigger fired'' where c=''stuff'';
return NULL;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER trg_x_after AFTER INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE fn_x_after();
CREATE TRIGGER trg_x_before BEFORE INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE fn_x_before();
COPY x (a, b, c, d, e) from stdin;
COPY x (b, d) from stdin;
COPY x (b, d) from stdin;
COPY x (a, b, c, d, e) from stdin;
-- non-existent column in column list: should fail
COPY x (xyz) from stdin;
ERROR: column "xyz" of relation "x" does not exist
-- too many columns in column list: should fail
COPY x (a, b, c, d, e, d, c) from stdin;
ERROR: column "d" specified more than once
-- missing data: should fail
COPY x from stdin;
ERROR: missing data for column "b"
CONTEXT: COPY x, line 1: ""
COPY x from stdin;
ERROR: missing data for column "e"
CONTEXT: COPY x, line 1: "2000 230 23 23"
COPY x from stdin;
ERROR: missing data for column "e"
CONTEXT: COPY x, line 1: "2001 231 \N \N"
-- extra data: should fail
COPY x from stdin;
ERROR: extra data after last expected column
CONTEXT: COPY x, line 1: "2002 232 40 50 60 70 80"
-- various COPY options: delimiters, oids, NULL string, encoding
COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x';
ERROR: table "x" does not have OIDs
500000,x,45,80,90
500001,x,\x,\\x,\\\x
invalid command \x,
500002,x,\,,\\\,,\\
invalid command \,,
\.
invalid command \.
COPY x from stdin WITH DELIMITER AS ';' NULL AS '';
ERROR: syntax error at or near "500000"
LINE 1: 500000,x,45,80,90
^
3000;;c;;
ERROR: syntax error at or near "3000"
LINE 1: 3000;
^
ERROR: syntax error at or near "c"
LINE 1: c;
^
\.
invalid command \.
COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X' ENCODING 'sql_ascii';
-- check results of copy in
SELECT * FROM x ORDER BY a, b;
a | b | c | d | e
-------+----+------------+--------+----------------------
4000 | | C | | before trigger fired
4001 | 1 | empty | | before trigger fired
4002 | 2 | null | | before trigger fired
4003 | 3 | Backslash | \ | before trigger fired
4004 | 4 | BackslashX | \X | before trigger fired
4005 | 5 | N | N | before trigger fired
4006 | 6 | BackslashN | \N | before trigger fired
4007 | 7 | XX | XX | before trigger fired
4008 | 8 | Delimiter | : | before trigger fired
9999 | | \N | NN | before trigger fired
10000 | 21 | 31 | 41 | before trigger fired
10001 | 22 | 32 | 42 | before trigger fired
10002 | 23 | 33 | 43 | before trigger fired
10003 | 24 | 34 | 44 | before trigger fired
10004 | 25 | 35 | 45 | before trigger fired
10005 | 26 | 36 | 46 | before trigger fired
| 1 | stuff | test_1 | after trigger fired
| 2 | stuff | test_2 | after trigger fired
| 3 | stuff | test_3 | after trigger fired
| 4 | stuff | test_4 | after trigger fired
| 5 | stuff | test_5 | after trigger fired
(21 rows)
-- COPY w/ oids on a table w/o oids should fail
CREATE TABLE no_oids (
a int,
b int
) WITHOUT OIDS;
INSERT INTO no_oids (a, b) VALUES (5, 10);
INSERT INTO no_oids (a, b) VALUES (20, 30);
-- should fail
COPY no_oids FROM stdin WITH OIDS;
ERROR: table "no_oids" does not have OIDs
COPY no_oids TO stdout WITH OIDS;
ERROR: table "no_oids" does not have OIDs
-- check copy out
COPY (select * from x order by 1,2,3,4,5) TO stdout;
4000 \N C \N before trigger fired
4001 1 empty \N before trigger fired
4002 2 null \N before trigger fired
4003 3 Backslash \\ before trigger fired
4004 4 BackslashX \\X before trigger fired
4005 5 N N before trigger fired
4006 6 BackslashN \\N before trigger fired
4007 7 XX XX before trigger fired
4008 8 Delimiter : before trigger fired
9999 \N \\N NN before trigger fired
10000 21 31 41 before trigger fired
10001 22 32 42 before trigger fired
10002 23 33 43 before trigger fired
10003 24 34 44 before trigger fired
10004 25 35 45 before trigger fired
10005 26 36 46 before trigger fired
\N 1 stuff test_1 after trigger fired
\N 2 stuff test_2 after trigger fired
\N 3 stuff test_3 after trigger fired
\N 4 stuff test_4 after trigger fired
\N 5 stuff test_5 after trigger fired
COPY (select c,e from x where c != 'N' order by 1,2) TO stdout;
31 before trigger fired
32 before trigger fired
33 before trigger fired
34 before trigger fired
35 before trigger fired
36 before trigger fired
Backslash before trigger fired
BackslashN before trigger fired
BackslashX before trigger fired
C before trigger fired
Delimiter before trigger fired
empty before trigger fired
\\N before trigger fired
null before trigger fired
stuff after trigger fired
stuff after trigger fired
stuff after trigger fired
stuff after trigger fired
stuff after trigger fired
XX before trigger fired
COPY (select b,e from x order by 1,2) TO stdout WITH NULL 'I''m null';
1 after trigger fired
1 before trigger fired
2 after trigger fired
2 before trigger fired
3 after trigger fired
3 before trigger fired
4 after trigger fired
4 before trigger fired
5 after trigger fired
5 before trigger fired
6 before trigger fired
7 before trigger fired
8 before trigger fired
21 before trigger fired
22 before trigger fired
23 before trigger fired
24 before trigger fired
25 before trigger fired
26 before trigger fired
I'm null before trigger fired
I'm null before trigger fired
CREATE TEMP TABLE y (
col1 text,
col2 text
);
INSERT INTO y VALUES ('Jackson, Sam', E'\\h');
INSERT INTO y VALUES ('It is "perfect".',E'\t');
INSERT INTO y VALUES ('', NULL);
COPY y TO stdout WITH CSV;
"Jackson, Sam",\h
"It is ""perfect"".",
,
COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|';
Jackson, Sam|\h
It is "perfect".|
|
COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\' ENCODING 'sql_ascii';
"Jackson, Sam","\\h"
"It is \"perfect\"."," "
,
COPY y TO stdout WITH CSV FORCE QUOTE *;
"Jackson, Sam","\h"
"It is ""perfect""."," "
,
-- Repeat above tests with new 9.0 option syntax
COPY y TO stdout (FORMAT CSV);
"Jackson, Sam",\h
"It is ""perfect"".",
,
COPY y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|');
Jackson, Sam|\h
It is "perfect".|
|
COPY y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\');
"Jackson, Sam","\\h"
"It is \"perfect\"."," "
,
COPY y TO stdout (FORMAT CSV, FORCE_QUOTE *);
"Jackson, Sam","\h"
"It is ""perfect""."," "
,
\copy y TO stdout (FORMAT CSV)
"Jackson, Sam",\h
"It is ""perfect"".",
,
\copy y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|')
Jackson, Sam|\h
It is "perfect".|
|
\copy y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\')
"Jackson, Sam","\\h"
"It is \"perfect\"."," "
,
\copy y TO stdout (FORMAT CSV, FORCE_QUOTE *)
"Jackson, Sam","\h"
"It is ""perfect""."," "
,
--test that we read consecutive LFs properly
CREATE TEMP TABLE testnl (a int, b text, c int);
COPY testnl FROM stdin CSV;
-- test end of copy marker
CREATE TABLE testeoc (a text) with (storage_type = ustore);
COPY testeoc FROM stdin CSV;
COPY (select * from testeoc order by a using ~<~) TO stdout CSV;
"\."
\.b
a\.
c\.d
-- test handling of nonstandard null marker that violates escaping rules
CREATE TEMP TABLE testnull(a int, b text);
INSERT INTO testnull VALUES (1, E'\\0'), (NULL, NULL);
COPY (select * from testnull order by 1,2) TO stdout WITH NULL AS E'\\0';
1 \\0
\0 \0
COPY testnull FROM stdin WITH NULL AS E'\\0';
SELECT * FROM testnull ORDER BY 1,2;
a | b
----+----
1 | \0
42 | \0
|
|
(4 rows)
START TRANSACTION;
CREATE TABLE vistest (LIKE testeoc) with (storage_type = ustore);
COPY vistest FROM stdin CSV;
COMMIT;
SELECT * FROM vistest order by 1;
a
----
a0
b
(2 rows)
START TRANSACTION;
TRUNCATE vistest;
COPY vistest FROM stdin CSV FREEZE;
SELECT * FROM vistest order by 1;
a
---
x
y
(2 rows)
COMMIT;
TRUNCATE vistest;
COPY vistest FROM stdin CSV FREEZE;
CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS
$$
BEGIN
TRUNCATE vistest;
--EXCEPTION
-- WHEN OTHERS THEN
-- INSERT INTO vistest VALUES ('subxact failure');
END;
$$ language plpgsql;
START TRANSACTION;
INSERT INTO vistest VALUES ('z');
SELECT truncate_in_subxact();
truncate_in_subxact
---------------------
(1 row)
COPY vistest FROM stdin CSV FREEZE;
SELECT * FROM vistest order by 1;
a
----
d4
e
(2 rows)
COMMIT;
SELECT * FROM vistest order by 1;
a
----
d4
e
(2 rows)
DROP TABLE vistest;
DROP FUNCTION truncate_in_subxact();
DROP TABLE x;
DROP TABLE y;
DROP FUNCTION fn_x_before();
DROP FUNCTION fn_x_after();

View File

@ -0,0 +1,230 @@
-- Enforce use of COMMIT instead of 2PC for temporary objects
CREATE TABLE x (
a int,
b int,
c text not null default 'stuff',
d text,
e text
) with (storage_type = ustore);
CREATE FUNCTION fn_x_before () RETURNS TRIGGER AS '
BEGIN
NEW.e := ''before trigger fired''::text;
return NEW;
END;
' LANGUAGE plpgsql;
CREATE FUNCTION fn_x_after () RETURNS TRIGGER AS '
BEGIN
UPDATE x set e=''after trigger fired'' where c=''stuff'';
return NULL;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER trg_x_after AFTER INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE fn_x_after();
CREATE TRIGGER trg_x_before BEFORE INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE fn_x_before();
COPY x (a, b, c, d, e) from stdin;
9999 \N \\N \NN \N
10000 21 31 41 51
\.
COPY x (b, d) from stdin;
1 test_1
\.
COPY x (b, d) from stdin;
2 test_2
3 test_3
4 test_4
5 test_5
\.
COPY x (a, b, c, d, e) from stdin;
10001 22 32 42 52
10002 23 33 43 53
10003 24 34 44 54
10004 25 35 45 55
10005 26 36 46 56
\.
-- non-existent column in column list: should fail
COPY x (xyz) from stdin;
-- too many columns in column list: should fail
COPY x (a, b, c, d, e, d, c) from stdin;
-- missing data: should fail
COPY x from stdin;
\.
COPY x from stdin;
2000 230 23 23
\.
COPY x from stdin;
2001 231 \N \N
\.
-- extra data: should fail
COPY x from stdin;
2002 232 40 50 60 70 80
\.
-- various COPY options: delimiters, oids, NULL string, encoding
COPY x (b, c, d, e) from stdin with oids delimiter ',' null 'x';
500000,x,45,80,90
500001,x,\x,\\x,\\\x
500002,x,\,,\\\,,\\
\.
COPY x from stdin WITH DELIMITER AS ';' NULL AS '';
3000;;c;;
\.
COPY x from stdin WITH DELIMITER AS ':' NULL AS E'\\X' ENCODING 'sql_ascii';
4000:\X:C:\X:\X
4001:1:empty::
4002:2:null:\X:\X
4003:3:Backslash:\\:\\
4004:4:BackslashX:\\X:\\X
4005:5:N:\N:\N
4006:6:BackslashN:\\N:\\N
4007:7:XX:\XX:\XX
4008:8:Delimiter:\::\:
\.
-- check results of copy in
SELECT * FROM x ORDER BY a, b;
-- COPY w/ oids on a table w/o oids should fail
CREATE TABLE no_oids (
a int,
b int
) WITHOUT OIDS;
INSERT INTO no_oids (a, b) VALUES (5, 10);
INSERT INTO no_oids (a, b) VALUES (20, 30);
-- should fail
COPY no_oids FROM stdin WITH OIDS;
COPY no_oids TO stdout WITH OIDS;
-- check copy out
COPY (select * from x order by 1,2,3,4,5) TO stdout;
COPY (select c,e from x where c != 'N' order by 1,2) TO stdout;
COPY (select b,e from x order by 1,2) TO stdout WITH NULL 'I''m null';
CREATE TEMP TABLE y (
col1 text,
col2 text
);
INSERT INTO y VALUES ('Jackson, Sam', E'\\h');
INSERT INTO y VALUES ('It is "perfect".',E'\t');
INSERT INTO y VALUES ('', NULL);
COPY y TO stdout WITH CSV;
COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|';
COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\' ENCODING 'sql_ascii';
COPY y TO stdout WITH CSV FORCE QUOTE *;
-- Repeat above tests with new 9.0 option syntax
COPY y TO stdout (FORMAT CSV);
COPY y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|');
COPY y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\');
COPY y TO stdout (FORMAT CSV, FORCE_QUOTE *);
\copy y TO stdout (FORMAT CSV)
\copy y TO stdout (FORMAT CSV, QUOTE '''', DELIMITER '|')
\copy y TO stdout (FORMAT CSV, FORCE_QUOTE (col2), ESCAPE E'\\')
\copy y TO stdout (FORMAT CSV, FORCE_QUOTE *)
--test that we read consecutive LFs properly
CREATE TEMP TABLE testnl (a int, b text, c int);
COPY testnl FROM stdin CSV;
1,"a field with two LFs
inside",2
\.
-- test end of copy marker
CREATE TABLE testeoc (a text) with (storage_type = ustore);
COPY testeoc FROM stdin CSV;
a\.
\.b
c\.d
"\."
\.
COPY (select * from testeoc order by a using ~<~) TO stdout CSV;
-- test handling of nonstandard null marker that violates escaping rules
CREATE TEMP TABLE testnull(a int, b text);
INSERT INTO testnull VALUES (1, E'\\0'), (NULL, NULL);
COPY (select * from testnull order by 1,2) TO stdout WITH NULL AS E'\\0';
COPY testnull FROM stdin WITH NULL AS E'\\0';
42 \\0
\0 \0
\.
SELECT * FROM testnull ORDER BY 1,2;
START TRANSACTION;
CREATE TABLE vistest (LIKE testeoc) with (storage_type = ustore);
COPY vistest FROM stdin CSV;
a0
b
\.
COMMIT;
SELECT * FROM vistest order by 1;
START TRANSACTION;
TRUNCATE vistest;
COPY vistest FROM stdin CSV FREEZE;
x
y
\.
SELECT * FROM vistest order by 1;
COMMIT;
TRUNCATE vistest;
COPY vistest FROM stdin CSV FREEZE;
p
g
\.
CREATE FUNCTION truncate_in_subxact() RETURNS VOID AS
$$
BEGIN
TRUNCATE vistest;
--EXCEPTION
-- WHEN OTHERS THEN
-- INSERT INTO vistest VALUES ('subxact failure');
END;
$$ language plpgsql;
START TRANSACTION;
INSERT INTO vistest VALUES ('z');
SELECT truncate_in_subxact();
COPY vistest FROM stdin CSV FREEZE;
d4
e
\.
SELECT * FROM vistest order by 1;
COMMIT;
SELECT * FROM vistest order by 1;
DROP TABLE vistest;
DROP FUNCTION truncate_in_subxact();
DROP TABLE x;
DROP TABLE y;
DROP FUNCTION fn_x_before();
DROP FUNCTION fn_x_after();