Skip to content

Commit 8f6e6f6

Browse files
committed
fix: ddl without variable
1 parent c9809df commit 8f6e6f6

File tree

3 files changed

+59
-18
lines changed

3 files changed

+59
-18
lines changed

mc2mc/internal/query/builder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func (b *Builder) constructMergeQuery(hrs, vars, queries []string) string {
200200
if headers != "" {
201201
builder.WriteString(fmt.Sprintf("%s\n", headers))
202202
}
203-
if variables != "" {
203+
if variables != "" && !IsDDL(q) { // skip variables if it's ddl
204204
builder.WriteString(fmt.Sprintf("%s\n", variables))
205205
}
206206
builder.WriteString(fmt.Sprintf("%s\n;", q))

mc2mc/internal/query/builder_test.go

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ SET append_test.id = 2;`
475475
DROP TABLE IF EXISTS append_tmp;
476476
@src := SELECT 1 id;
477477
478-
CREATE TABLE append_tmp AS SELECT * FROM @src;
478+
CREATE TABLE append_tmp AS SELECT * FROM sample_table;
479479
480480
MERGE INTO append_test
481481
USING (SELECT * FROM @src) source
@@ -498,9 +498,7 @@ DROP TABLE IF EXISTS append_tmp
498498
--*--optimus-break-marker--*--
499499
SET odps.table.append2.enable=true
500500
;
501-
@src := SELECT 1 id
502-
;
503-
CREATE TABLE append_tmp AS SELECT * FROM @src
501+
CREATE TABLE append_tmp AS SELECT * FROM sample_table
504502
;
505503
--*--optimus-break-marker--*--
506504
SET odps.table.append2.enable=true
@@ -726,7 +724,7 @@ SET append_test.id = 2
726724
DROP TABLE IF EXISTS append_tmp;
727725
@src := SELECT 1 id;
728726
729-
CREATE TABLE append_tmp AS SELECT * FROM @src;
727+
CREATE TABLE append_tmp AS SELECT * FROM sample_table;
730728
731729
@src2 := SELECT id FROM append_tmp;
732730
@@ -750,9 +748,51 @@ DROP TABLE IF EXISTS append_tmp
750748
--*--optimus-break-marker--*--
751749
SET odps.table.append2.enable=true
752750
;
751+
CREATE TABLE append_tmp AS SELECT * FROM sample_table
752+
;
753+
--*--optimus-break-marker--*--
754+
SET odps.table.append2.enable=true
755+
;
753756
@src := SELECT 1 id
754757
;
755-
CREATE TABLE append_tmp AS SELECT * FROM @src
758+
@src2 := SELECT id FROM append_tmp
759+
;
760+
MERGE INTO append_test
761+
USING (SELECT * FROM @src2) source
762+
on append_test.id = source.id
763+
WHEN MATCHED THEN UPDATE
764+
SET append_test.id = 2
765+
;`, query)
766+
})
767+
t.Run("returns query for merge load method with correct ddl ordering", func(t *testing.T) {
768+
queryToExecute := `SET odps.table.append2.enable=true;
769+
@src := SELECT 1 id;
770+
@src2 := SELECT id FROM append_tmp;
771+
DROP TABLE IF EXISTS append_tmp;
772+
773+
CREATE TABLE append_tmp AS SELECT * FROM sample_table;
774+
775+
MERGE INTO append_test
776+
USING (SELECT * FROM @src2) source
777+
on append_test.id = source.id
778+
WHEN MATCHED THEN UPDATE
779+
SET append_test.id = 2;`
780+
odspClient := &mockOdpsClient{}
781+
query, err := query.NewBuilder(
782+
logger.NewDefaultLogger(),
783+
odspClient,
784+
query.WithQuery(queryToExecute),
785+
query.WithMethod(query.MERGE),
786+
).Build()
787+
assert.NoError(t, err)
788+
assert.Equal(t, `SET odps.table.append2.enable=true
789+
;
790+
DROP TABLE IF EXISTS append_tmp
791+
;
792+
--*--optimus-break-marker--*--
793+
SET odps.table.append2.enable=true
794+
;
795+
CREATE TABLE append_tmp AS SELECT * FROM sample_table
756796
;
757797
--*--optimus-break-marker--*--
758798
SET odps.table.append2.enable=true

mc2mc/internal/query/helper.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ const (
1111
)
1212

1313
var (
14-
semicolonPattern = regexp.MustCompile(`;\s*(\n+|$)`) // regex to match semicolons
15-
commentPattern = regexp.MustCompile(`--[^\n]*`) // regex to match comments
16-
multiCommentPattern = regexp.MustCompile(`(?s)/\*.*?\*/`) // regex to match multi-line comments
17-
headerPattern = regexp.MustCompile(`(?i)^set`) // regex to match header statements
18-
variablePattern = regexp.MustCompile(`(?i)^@`) // regex to match variable statements
19-
dropPattern = regexp.MustCompile(`(?i)^DROP\s+`) // regex to match DROP statements
20-
udfPattern = regexp.MustCompile(`(?i)^function\s+`) // regex to match UDF statements
21-
ddlPattern = regexp.MustCompile(`(?i)^CREATE\s+`) // regex to match DDL statements
22-
stringPattern = regexp.MustCompile(`'[^']*'`) // regex to match SQL strings (anything inside single quotes)
14+
semicolonPattern = regexp.MustCompile(`;\s*(\n+|$)`) // regex to match semicolons
15+
commentPattern = regexp.MustCompile(`--[^\n]*`) // regex to match comments
16+
multiCommentPattern = regexp.MustCompile(`(?s)/\*.*?\*/`) // regex to match multi-line comments
17+
headerPattern = regexp.MustCompile(`(?i)^set`) // regex to match header statements
18+
variablePattern = regexp.MustCompile(`(?i)^@`) // regex to match variable statements
19+
dropPattern = regexp.MustCompile(`(?i)^DROP\s+`) // regex to match DROP statements
20+
udfPattern = regexp.MustCompile(`(?i)^function\s+`) // regex to match UDF statements
21+
ddlPattern = regexp.MustCompile(`(?i)^(CREATE|ALTER|DROP|TRUNCATE)\s+`) // regex to match DDL statements
22+
stringPattern = regexp.MustCompile(`'[^']*'`) // regex to match SQL strings (anything inside single quotes)
2323
)
2424

2525
func SplitQueryComponents(query string) (headers []string, varsUDFs []string, queries []string) {
@@ -227,6 +227,7 @@ func RestoreStringLiteral(query string, placeholders map[string]string) string {
227227
return query
228228
}
229229

230-
func IsDDL(query string) bool {
231-
return ddlPattern.MatchString(query)
230+
func IsDDL(stmt string) bool {
231+
stmtWithoutComment := RemoveComments(stmt)
232+
return ddlPattern.MatchString(strings.TrimSpace(stmtWithoutComment))
232233
}

0 commit comments

Comments
 (0)