From ef0ee211bbf9e8868fcdaee2472b1c2070922b71 Mon Sep 17 00:00:00 2001 From: slbaiyi Date: Mon, 28 Nov 2022 11:54:17 +0800 Subject: [PATCH] commit 1 --- src/bin/psql/mainloop.cpp | 13 ++++++++++++- src/common/backend/parser/scan.l | 1 + src/test/regress/expected/mysql_delimiter.out | 13 +++++++++++++ src/test/regress/sql/mysql_delimiter.sql | 6 ++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/mainloop.cpp b/src/bin/psql/mainloop.cpp index d9e014f99..aaf5a59fe 100644 --- a/src/bin/psql/mainloop.cpp +++ b/src/bin/psql/mainloop.cpp @@ -174,6 +174,8 @@ static char* get_correct_str(char*str, const char *delimiter_name, bool is_new_l bool is_delimiter = false; char *token = strstr(str_temp, "delimiter"); errno_t rc = 0; + char* end_str = NULL; + if(token != NULL) { is_delimiter = true; char* pos = str_temp; @@ -187,12 +189,13 @@ static char* get_correct_str(char*str, const char *delimiter_name, bool is_new_l } if(is_delimiter) { char* end = pos + strlen("delimiter"); + end_str = str + (end - str_temp); if(*end != ' ' && *end != '\0') { is_delimiter = false; } } } - if (is_new_lines && is_delimiter && strstr(str, delimiter_name) == NULL) { + if (is_new_lines && is_delimiter && strstr(end_str, delimiter_name) == NULL) { Size slen1 = strlen(str) + strlen(delimiter_name) + DELIMITER_LENGTH; char* result1 = (char *) pg_malloc(slen1); rc = sprintf_s(result1, slen1, "%s %s", str, delimiter_name); @@ -215,6 +218,14 @@ static char* get_correct_str(char*str, const char *delimiter_name, bool is_new_l char special_str = 0; char in; for (pos = str; pos < end_of_str; pos++) { + if (is_delimiter) { + int delimiter_length = strlen("delimiter"); + while (delimiter_length > 0 && *pos != '\0') { + *temp++ = *pos++; + delimiter_length--; + } + is_delimiter = false; + } in = *pos; if (!special_str && is_match_delimiter_name(pos , delimiter_name)) { *temp++ =' '; diff --git a/src/common/backend/parser/scan.l b/src/common/backend/parser/scan.l index b4abce9ca..238bf6d73 100755 --- a/src/common/backend/parser/scan.l +++ b/src/common/backend/parser/scan.l @@ -1138,6 +1138,7 @@ other . yyextra->is_hint_str = true; } + set_is_delimiter_name(yytext,yyscanner); return keyword->value; } diff --git a/src/test/regress/expected/mysql_delimiter.out b/src/test/regress/expected/mysql_delimiter.out index 17c7a400f..1dbb17d38 100644 --- a/src/test/regress/expected/mysql_delimiter.out +++ b/src/test/regress/expected/mysql_delimiter.out @@ -94,6 +94,19 @@ select 1aa 1 (1 row) +delimiter ; +delimiter de +delimiter abcde +select 1abc + ?column? +---------- + 1 +(1 row) + +delimiter +ERROR: syntax error at or near "abc" +LINE 1: delimiter abc + ^ delimiter ; \c regression drop database my_test; diff --git a/src/test/regress/sql/mysql_delimiter.sql b/src/test/regress/sql/mysql_delimiter.sql index 54bc0d2c4..c701432f9 100644 --- a/src/test/regress/sql/mysql_delimiter.sql +++ b/src/test/regress/sql/mysql_delimiter.sql @@ -47,5 +47,11 @@ delimiter aa select 1aa delimiter ; +delimiter de +delimiter abcde +select 1abc +delimiter +delimiter ; + \c regression drop database my_test; \ No newline at end of file