diff options
author | Mars Agliullin <marsaly@ydb.tech> | 2024-01-27 20:41:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-27 20:41:43 +0300 |
commit | 67b68ea370f81aa4891a52674cef01818423f124 (patch) | |
tree | 05e7c0664a4efe2475bd0a9381b31c6d75eec3ec | |
parent | 621e3d86c4e02bf3c88bb68e5aba5856fbf0185d (diff) | |
download | ydb-67b68ea370f81aa4891a52674cef01818423f124.tar.gz |
YQL-17583: DELETE with alias crash fix (#1360)
-rw-r--r-- | ydb/library/yql/sql/pg/pg_sql.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/tests/postgresql/cases/delete.err | 57 | ||||
-rw-r--r-- | ydb/library/yql/tests/postgresql/cases/delete.out | 4 | ||||
-rw-r--r-- | ydb/library/yql/tests/postgresql/cases/delete.sql | 4 | ||||
-rw-r--r-- | ydb/library/yql/tests/postgresql/pg_tests.csv | 2 | ||||
-rw-r--r-- | ydb/library/yql/tests/postgresql/status.md | 2 |
6 files changed, 46 insertions, 27 deletions
diff --git a/ydb/library/yql/sql/pg/pg_sql.cpp b/ydb/library/yql/sql/pg/pg_sql.cpp index 03bc0ffacb..1615299653 100644 --- a/ydb/library/yql/sql/pg/pg_sql.cpp +++ b/ydb/library/yql/sql/pg/pg_sql.cpp @@ -2285,6 +2285,10 @@ public: auto [sink, key] = ParseWriteRangeVar(value->relation); + if (!sink || !key) { + return nullptr; + } + std::vector<TAstNode*> options; options.push_back(QL(QA("pg_delete"), select)); options.push_back(QL(QA("mode"), QA("delete"))); diff --git a/ydb/library/yql/tests/postgresql/cases/delete.err b/ydb/library/yql/tests/postgresql/cases/delete.err index 27e843fed6..694a9c8381 100644 --- a/ydb/library/yql/tests/postgresql/cases/delete.err +++ b/ydb/library/yql/tests/postgresql/cases/delete.err @@ -18,28 +18,35 @@ INSERT INTO delete_test (a) VALUES (100); -- allow an alias to be specified for DELETE's target table DELETE FROM delete_test AS dt WHERE dt.a > 75; </sql-statement> -VERIFY failed (2023-12-12T19:40:06.503020+0300): - ydb/library/yql/ast/yql_ast.h:163 - NewList(): requirement poolChildren[index] failed -BackTrace(void**, unsigned long)+29 (0x14087F6D) -FormatBackTrace(IOutputStream*)+32 (0x14088440) -PrintBackTrace()+17 (0x14088491) -NPrivate::InternalPanicImpl(int, char const*, char const*, int, int, int, TBasicStringBuf<char, std::__y1::char_traits<char> >, char const*, unsigned long)+995 (0x140CE743) -NPrivate::Panic(NPrivate::TStaticBuf const&, int, char const*, char const*, char const*, ...)+418 (0x140C18B2) -NYql::TAstNode::NewList(NYql::TPosition, NYql::TAstNode**, unsigned int, TMemoryPool&)+329 (0x14A48409) -NYql::TAstNode* NSQLTranslationPG::TConverter::L<NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*>(NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*, NYql::TAstNode*)+276 (0x155B9CD4) -NSQLTranslationPG::TConverter::ParseDeleteStmt(DeleteStmt const*)+6165 (0x155AF055) -NSQLTranslationPG::TConverter::ParseRawStmt(RawStmt const*)+1054 (0x155A03EE) -NSQLTranslationPG::TConverter::ParseResult(List const*)+1256 (0x1559E908) -NSQLTranslationPG::TConverter::OnResult(List const*)+83 (0x1559BD23) -NYql::PGParse(TBasicString<char, std::__y1::char_traits<char> > const&, NYql::IPGParseEvents&)+1043 (0x1B7A3F33) -NSQLTranslationPG::PGToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&)+131 (0x1559A653) -NSQLTranslation::SqlToYql(TBasicString<char, std::__y1::char_traits<char> > const&, NSQLTranslation::TTranslationSettings const&, TVector<NYql::TWarningRule, std::__y1::allocator<NYql::TWarningRule> >*, unsigned short*)+749 (0x1559680D) -NYql::TProgram::ParseSql(NSQLTranslation::TTranslationSettings const&)+676 (0x16C0D5A4) -Main(int, char**)+3099 (0x13F1462B) -main+273 (0x13F16831) -??+0 (0x7FD9F3629D90) -__libc_start_main+128 (0x7FD9F3629E40) -??+0 (0x13EA0029) -pthread_kill at ./nptl/./nptl/pthread_kill.c:43:17 -?? at ??:0:0 +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + -- allow an alias to be specified for DELETE's target table + ^ +<sql-statement> +-- if an alias is specified, don't allow the original table name +-- to be referenced +DELETE FROM delete_test dt WHERE delete_test.a > 25; +</sql-statement> +-stdin-:<main>: Error: Parse Sql + + -stdin-:<main>:1:1: Error: alias is not supported + -- if an alias is specified, don't allow the original table name + ^ +<sql-statement> +SELECT id, a, char_length(b) FROM delete_test; +</sql-statement> +<sql-statement> +-- delete a row with a TOASTed value +DELETE FROM delete_test WHERE a > 25; +</sql-statement> +-stdin-:<main>: Fatal: Pre type annotation + + -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_delete' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys'. + +<sql-statement> +SELECT id, a, char_length(b) FROM delete_test; +</sql-statement> +<sql-statement> +DROP TABLE delete_test; +</sql-statement> diff --git a/ydb/library/yql/tests/postgresql/cases/delete.out b/ydb/library/yql/tests/postgresql/cases/delete.out index e0469409bf..6ab34ba7e2 100644 --- a/ydb/library/yql/tests/postgresql/cases/delete.out +++ b/ydb/library/yql/tests/postgresql/cases/delete.out @@ -3,3 +3,7 @@ CREATE TABLE delete_test ( a INT, b text ); +INSERT INTO delete_test (a) VALUES (10); +INSERT INTO delete_test (a, b) VALUES (50, repeat('x', 10000)); +INSERT INTO delete_test (a) VALUES (100); +DROP TABLE delete_test; diff --git a/ydb/library/yql/tests/postgresql/cases/delete.sql b/ydb/library/yql/tests/postgresql/cases/delete.sql index e0469409bf..6ab34ba7e2 100644 --- a/ydb/library/yql/tests/postgresql/cases/delete.sql +++ b/ydb/library/yql/tests/postgresql/cases/delete.sql @@ -3,3 +3,7 @@ CREATE TABLE delete_test ( a INT, b text ); +INSERT INTO delete_test (a) VALUES (10); +INSERT INTO delete_test (a, b) VALUES (50, repeat('x', 10000)); +INSERT INTO delete_test (a) VALUES (100); +DROP TABLE delete_test; diff --git a/ydb/library/yql/tests/postgresql/pg_tests.csv b/ydb/library/yql/tests/postgresql/pg_tests.csv index fe596ddc21..6aae8ba352 100644 --- a/ydb/library/yql/tests/postgresql/pg_tests.csv +++ b/ydb/library/yql/tests/postgresql/pg_tests.csv @@ -11,7 +11,7 @@ create_misc,76,3,3.95 create_table,368,43,11.68 date,264,200,75.76 dbsize,24,24,100.0 -delete,10,0,0.0 +delete,10,5,50.0 expressions,63,14,22.22 float4,96,82,85.42 float8,168,140,83.33 diff --git a/ydb/library/yql/tests/postgresql/status.md b/ydb/library/yql/tests/postgresql/status.md index 320d741132..180c51305d 100644 --- a/ydb/library/yql/tests/postgresql/status.md +++ b/ydb/library/yql/tests/postgresql/status.md @@ -44,7 +44,7 @@ || 40 | aggregates | 416 | 66 (+15) | 15.87 | 23.01.2024 | YQL-17627 || || 41 | arrays | 410 | 119 | 29.02 | 12.12.2023 | || || 42 | update | 288 | 22 | 7.64 | 12.12.2023 | :-переменные || -|| 43 | delete | 10 | 0 | 0.0 | 25.05.2023 | YQL-17585 || +|| 43 | delete | 10 | 5 (+5) | 50.0 | 27.01.2024 | YQL-17585 || || 44 | dbsize | 24 | 24 | 100.0 | 10.08.2023 | || || 45 | window | 298 | 5 | 1.68 | 12.12.2023 | YQL-17592 || || 46 | functional_deps | 40 | 7 (+1) | 17.5 | 19.01.2024 | || |