Browse Source

YQL-18005: fix statement cleanup in pgrun (#2429)

Mars Agliullin 1 year ago
parent
commit
377a29f6c6

+ 228 - 0
ydb/library/yql/tests/postgresql/cases/uuid.err

@@ -0,0 +1,228 @@
+<sql-statement>
+-- regression test for the uuid datatype
+-- creating test tables
+CREATE TABLE guid1
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+</sql-statement>
+<sql-statement>
+CREATE TABLE guid2
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+</sql-statement>
+<sql-statement>
+-- inserting invalid data tests
+-- too long
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111F');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	-- inserting invalid data tests
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "11111111-1111-1111-1111-111111111111F"
+
+        	-- inserting invalid data tests
+	^
+<sql-statement>
+-- too short
+INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-1111-11111111111}');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	-- too short
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "{11111111-1111-1111-1111-11111111111}"
+
+        	-- too short
+	^
+<sql-statement>
+-- valid data but invalid format
+INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-1111-111111111111');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	-- valid data but invalid format
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "111-11111-1111-1111-1111-111111111111"
+
+        	-- valid data but invalid format
+	^
+<sql-statement>
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "{22222222-2222-2222-2222-222222222222 "
+
+        	INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
+	^
+<sql-statement>
+-- invalid data
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G111-111111111111');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	-- invalid data
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "11111111-1111-1111-G111-111111111111"
+
+        	-- invalid data
+	^
+<sql-statement>
+INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
+</sql-statement>
+-stdin-:<main>: Fatal: Execution
+
+    -stdin-:<main>:1:1: Fatal: Execution of node: YtFill!
+    	INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
+	^
+        -stdin-:<main>:1:1: Fatal: ERROR:  invalid input syntax for type uuid: "11+11111-1111-1111-1111-111111111111"
+
+        	INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
+	^
+<sql-statement>
+--inserting three input formats
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+</sql-statement>
+<sql-statement>
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+</sql-statement>
+<sql-statement>
+INSERT INTO guid1(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+</sql-statement>
+<sql-statement>
+-- retrieving the inserted data
+SELECT guid_field FROM guid1;
+</sql-statement>
+<sql-statement>
+-- ordering test
+SELECT guid_field FROM guid1 ORDER BY guid_field ASC;
+</sql-statement>
+<sql-statement>
+SELECT guid_field FROM guid1 ORDER BY guid_field DESC;
+</sql-statement>
+<sql-statement>
+-- = operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field = '3f3e3c3b-3a30-3938-3736-353433a2313e';
+</sql-statement>
+<sql-statement>
+-- <> operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <> '11111111111111111111111111111111';
+</sql-statement>
+<sql-statement>
+-- < operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field < '22222222-2222-2222-2222-222222222222';
+</sql-statement>
+<sql-statement>
+-- <= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <= '22222222-2222-2222-2222-222222222222';
+</sql-statement>
+<sql-statement>
+-- > operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field > '22222222-2222-2222-2222-222222222222';
+</sql-statement>
+<sql-statement>
+-- >= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field >= '22222222-2222-2222-2222-222222222222';
+</sql-statement>
+<sql-statement>
+-- btree and hash index creation test
+CREATE INDEX guid1_btree ON guid1 USING BTREE (guid_field);
+</sql-statement>
+<sql-statement>
+CREATE INDEX guid1_hash  ON guid1 USING HASH  (guid_field);
+</sql-statement>
+<sql-statement>
+-- unique index test
+CREATE UNIQUE INDEX guid1_unique_BTREE ON guid1 USING BTREE (guid_field);
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+    -stdin-:<main>:1:1: Error: unique index creation is not supported yet
+    	-- unique index test
+	^
+<sql-statement>
+-- should fail
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+</sql-statement>
+<sql-statement>
+-- check to see whether the new indexes are actually there
+SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%';
+</sql-statement>
+-stdin-:<main>: Error: Type annotation
+
+    -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect
+    	-- check to see whether the new indexes are actually there
+	^
+        -stdin-:<main>: Error: At function: PgSetItem
+        
+            -stdin-:<main>:1:1: Error: At function: PgWhere
+            	-- check to see whether the new indexes are actually there
+	^
+                -stdin-:<main>:2:49: Error: At function: PgAnd
+                	SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%';
+	                                                ^
+                    -stdin-:<main>:2:61: Error: At function: PgLike
+                    	SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%';
+	                                                            ^
+                        -stdin-:<main>:2:61: Error: Expected pg text, but got name
+                        	SELECT count(*) FROM pg_class WHERE relkind='i' AND relname LIKE 'guid%';
+	                                                            ^
+<sql-statement>
+-- populating the test tables with additional records
+INSERT INTO guid1(guid_field) VALUES('44444444-4444-4444-4444-444444444444');
+</sql-statement>
+<sql-statement>
+INSERT INTO guid2(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+</sql-statement>
+<sql-statement>
+INSERT INTO guid2(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+</sql-statement>
+<sql-statement>
+INSERT INTO guid2(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+</sql-statement>
+<sql-statement>
+-- join test
+SELECT COUNT(*) FROM guid1 g1 INNER JOIN guid2 g2 ON g1.guid_field = g2.guid_field;
+</sql-statement>
+<sql-statement>
+SELECT COUNT(*) FROM guid1 g1 LEFT JOIN guid2 g2 ON g1.guid_field = g2.guid_field WHERE g2.guid_field IS NULL;
+</sql-statement>
+<sql-statement>
+-- generation test
+TRUNCATE guid1;
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+    -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 257
+    	-- generation test
+	^
+<sql-statement>
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());
+</sql-statement>
+<sql-statement>
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());
+</sql-statement>
+<sql-statement>
+SELECT count(DISTINCT guid_field) FROM guid1;
+</sql-statement>
+<sql-statement>
+-- clean up
+DROP TABLE guid1, guid2 CASCADE;
+</sql-statement>
+-stdin-:<main>: Error: Parse Sql
+
+    -stdin-:<main>:1:1: Error: CASCADE is not implemented
+    	-- clean up
+	^

+ 129 - 0
ydb/library/yql/tests/postgresql/cases/uuid.out

@@ -0,0 +1,129 @@
+-- regression test for the uuid datatype
+-- creating test tables
+CREATE TABLE guid1
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+CREATE TABLE guid2
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+-- inserting invalid data tests
+-- too long
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111F');
+ERROR:  invalid input syntax for type uuid: "11111111-1111-1111-1111-111111111111F"
+LINE 1: INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-111...
+                                             ^
+-- too short
+INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-1111-11111111111}');
+ERROR:  invalid input syntax for type uuid: "{11111111-1111-1111-1111-11111111111}"
+LINE 1: INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-11...
+                                             ^
+-- valid data but invalid format
+INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-1111-111111111111');
+ERROR:  invalid input syntax for type uuid: "111-11111-1111-1111-1111-111111111111"
+LINE 1: INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-11...
+                                             ^
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
+ERROR:  invalid input syntax for type uuid: "{22222222-2222-2222-2222-222222222222 "
+LINE 1: INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-22...
+                                             ^
+-- invalid data
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G111-111111111111');
+ERROR:  invalid input syntax for type uuid: "11111111-1111-1111-G111-111111111111"
+LINE 1: INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G11...
+                                             ^
+INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
+ERROR:  invalid input syntax for type uuid: "11+11111-1111-1111-1111-111111111111"
+LINE 1: INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-111...
+                                             ^
+--inserting three input formats
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+INSERT INTO guid1(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+-- retrieving the inserted data
+SELECT guid_field FROM guid1;
+              guid_field              
+--------------------------------------
+ 11111111-1111-1111-1111-111111111111
+ 22222222-2222-2222-2222-222222222222
+ 3f3e3c3b-3a30-3938-3736-353433a2313e
+(3 rows)
+
+-- ordering test
+SELECT guid_field FROM guid1 ORDER BY guid_field ASC;
+              guid_field              
+--------------------------------------
+ 11111111-1111-1111-1111-111111111111
+ 22222222-2222-2222-2222-222222222222
+ 3f3e3c3b-3a30-3938-3736-353433a2313e
+(3 rows)
+
+SELECT guid_field FROM guid1 ORDER BY guid_field DESC;
+              guid_field              
+--------------------------------------
+ 3f3e3c3b-3a30-3938-3736-353433a2313e
+ 22222222-2222-2222-2222-222222222222
+ 11111111-1111-1111-1111-111111111111
+(3 rows)
+
+-- = operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field = '3f3e3c3b-3a30-3938-3736-353433a2313e';
+ count 
+-------
+     1
+(1 row)
+
+-- <> operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <> '11111111111111111111111111111111';
+ count 
+-------
+     2
+(1 row)
+
+-- < operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field < '22222222-2222-2222-2222-222222222222';
+ count 
+-------
+     1
+(1 row)
+
+-- <= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <= '22222222-2222-2222-2222-222222222222';
+ count 
+-------
+     2
+(1 row)
+
+-- > operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field > '22222222-2222-2222-2222-222222222222';
+ count 
+-------
+     1
+(1 row)
+
+-- >= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field >= '22222222-2222-2222-2222-222222222222';
+ count 
+-------
+     2
+(1 row)
+
+-- btree and hash index creation test
+CREATE INDEX guid1_btree ON guid1 USING BTREE (guid_field);
+CREATE INDEX guid1_hash  ON guid1 USING HASH  (guid_field);
+-- populating the test tables with additional records
+INSERT INTO guid1(guid_field) VALUES('44444444-4444-4444-4444-444444444444');
+INSERT INTO guid2(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+INSERT INTO guid2(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+INSERT INTO guid2(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+SELECT COUNT(*) FROM guid1 g1 LEFT JOIN guid2 g2 ON g1.guid_field = g2.guid_field WHERE g2.guid_field IS NULL;
+ count 
+-------
+     1
+(1 row)
+
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());

+ 55 - 0
ydb/library/yql/tests/postgresql/cases/uuid.sql

@@ -0,0 +1,55 @@
+-- regression test for the uuid datatype
+-- creating test tables
+CREATE TABLE guid1
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+CREATE TABLE guid2
+(
+	guid_field UUID,
+	text_field TEXT DEFAULT(now())
+);
+-- inserting invalid data tests
+-- too long
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111F');
+-- too short
+INSERT INTO guid1(guid_field) VALUES('{11111111-1111-1111-1111-11111111111}');
+-- valid data but invalid format
+INSERT INTO guid1(guid_field) VALUES('111-11111-1111-1111-1111-111111111111');
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
+-- invalid data
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-G111-111111111111');
+INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
+--inserting three input formats
+INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+INSERT INTO guid1(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+-- retrieving the inserted data
+SELECT guid_field FROM guid1;
+-- ordering test
+SELECT guid_field FROM guid1 ORDER BY guid_field ASC;
+SELECT guid_field FROM guid1 ORDER BY guid_field DESC;
+-- = operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field = '3f3e3c3b-3a30-3938-3736-353433a2313e';
+-- <> operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <> '11111111111111111111111111111111';
+-- < operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field < '22222222-2222-2222-2222-222222222222';
+-- <= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field <= '22222222-2222-2222-2222-222222222222';
+-- > operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field > '22222222-2222-2222-2222-222222222222';
+-- >= operator test
+SELECT COUNT(*) FROM guid1 WHERE guid_field >= '22222222-2222-2222-2222-222222222222';
+-- btree and hash index creation test
+CREATE INDEX guid1_btree ON guid1 USING BTREE (guid_field);
+CREATE INDEX guid1_hash  ON guid1 USING HASH  (guid_field);
+-- populating the test tables with additional records
+INSERT INTO guid1(guid_field) VALUES('44444444-4444-4444-4444-444444444444');
+INSERT INTO guid2(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
+INSERT INTO guid2(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');
+INSERT INTO guid2(guid_field) VALUES('3f3e3c3b3a3039383736353433a2313e');
+SELECT COUNT(*) FROM guid1 g1 LEFT JOIN guid2 g2 ON g1.guid_field = g2.guid_field WHERE g2.guid_field IS NULL;
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());
+INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid());

+ 0 - 1
ydb/library/yql/tests/postgresql/make-tests.sh

@@ -7,7 +7,6 @@
   --dstdir=cases \
   --runner=../../tools/pgrun/pgrun \
   --splitter="../../tools/pgrun/pgrun split-statements" \
-  --skip=uuid \
   --udf=../../udfs/common/set/libset_udf.so \
   --udf=../../udfs/common/re2/libre2_udf.so \
   --report=pg_tests.csv \

+ 1 - 0
ydb/library/yql/tests/postgresql/pg_tests.csv

@@ -51,6 +51,7 @@ truncate,193,41,21.24
 unicode,13,4,30.77
 union,186,55,29.57
 update,288,23,7.99
+uuid,36,29,80.56
 varchar,24,15,62.5
 window,298,5,1.68
 xml,234,18,7.69

+ 2 - 2
ydb/library/yql/tools/pgrun/pgrun.cpp

@@ -662,8 +662,8 @@ TString GetFormattedStmt(const TStringBuf& stmt) {
     size_t pos = 0, next_pos = TStringBuf::npos;
 
     while (TStringBuf::npos != (next_pos = stmt.find('\n', pos))) {
-        if (1 < next_pos - pos) {
-            if (!(stmt[pos] == '\r' && 2 == next_pos - pos)) {
+        if (0 < next_pos - pos) {
+            if (!(stmt[pos] == '\r' && 1 == next_pos - pos)) {
                 result += stmt.substr(pos, next_pos - pos + 1);
             }
         }