aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMars Agliullin <marsaly@ydb.tech>2024-01-27 20:41:43 +0300
committerGitHub <noreply@github.com>2024-01-27 20:41:43 +0300
commit67b68ea370f81aa4891a52674cef01818423f124 (patch)
tree05e7c0664a4efe2475bd0a9381b31c6d75eec3ec
parent621e3d86c4e02bf3c88bb68e5aba5856fbf0185d (diff)
downloadydb-67b68ea370f81aa4891a52674cef01818423f124.tar.gz
YQL-17583: DELETE with alias crash fix (#1360)
-rw-r--r--ydb/library/yql/sql/pg/pg_sql.cpp4
-rw-r--r--ydb/library/yql/tests/postgresql/cases/delete.err57
-rw-r--r--ydb/library/yql/tests/postgresql/cases/delete.out4
-rw-r--r--ydb/library/yql/tests/postgresql/cases/delete.sql4
-rw-r--r--ydb/library/yql/tests/postgresql/pg_tests.csv2
-rw-r--r--ydb/library/yql/tests/postgresql/status.md2
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 | ||