Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mc2mc/internal/query/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ func (b *Builder) constructMergeQuery(hrs, vars, queries []string) string {
if headers != "" {
builder.WriteString(fmt.Sprintf("%s\n", headers))
}
if variables != "" {
if variables != "" && !IsDDL(q) { // skip variables if it's ddl
builder.WriteString(fmt.Sprintf("%s\n", variables))
}
builder.WriteString(fmt.Sprintf("%s\n;", q))
Expand Down
52 changes: 46 additions & 6 deletions mc2mc/internal/query/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ SET append_test.id = 2;`
DROP TABLE IF EXISTS append_tmp;
@src := SELECT 1 id;

CREATE TABLE append_tmp AS SELECT * FROM @src;
CREATE TABLE append_tmp AS SELECT * FROM sample_table;

MERGE INTO append_test
USING (SELECT * FROM @src) source
Expand All @@ -498,9 +498,7 @@ DROP TABLE IF EXISTS append_tmp
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
;
@src := SELECT 1 id
;
CREATE TABLE append_tmp AS SELECT * FROM @src
CREATE TABLE append_tmp AS SELECT * FROM sample_table
;
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
Expand Down Expand Up @@ -726,7 +724,7 @@ SET append_test.id = 2
DROP TABLE IF EXISTS append_tmp;
@src := SELECT 1 id;

CREATE TABLE append_tmp AS SELECT * FROM @src;
CREATE TABLE append_tmp AS SELECT * FROM sample_table;

@src2 := SELECT id FROM append_tmp;

Expand All @@ -750,9 +748,51 @@ DROP TABLE IF EXISTS append_tmp
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
;
CREATE TABLE append_tmp AS SELECT * FROM sample_table
;
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
;
@src := SELECT 1 id
;
CREATE TABLE append_tmp AS SELECT * FROM @src
@src2 := SELECT id FROM append_tmp
;
MERGE INTO append_test
USING (SELECT * FROM @src2) source
on append_test.id = source.id
WHEN MATCHED THEN UPDATE
SET append_test.id = 2
;`, query)
})
t.Run("returns query for merge load method with correct ddl ordering", func(t *testing.T) {
queryToExecute := `SET odps.table.append2.enable=true;
@src := SELECT 1 id;
@src2 := SELECT id FROM append_tmp;
DROP TABLE IF EXISTS append_tmp;

CREATE TABLE append_tmp AS SELECT * FROM sample_table;

MERGE INTO append_test
USING (SELECT * FROM @src2) source
on append_test.id = source.id
WHEN MATCHED THEN UPDATE
SET append_test.id = 2;`
odspClient := &mockOdpsClient{}
query, err := query.NewBuilder(
logger.NewDefaultLogger(),
odspClient,
query.WithQuery(queryToExecute),
query.WithMethod(query.MERGE),
).Build()
assert.NoError(t, err)
assert.Equal(t, `SET odps.table.append2.enable=true
;
DROP TABLE IF EXISTS append_tmp
;
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
;
CREATE TABLE append_tmp AS SELECT * FROM sample_table
;
--*--optimus-break-marker--*--
SET odps.table.append2.enable=true
Expand Down
23 changes: 12 additions & 11 deletions mc2mc/internal/query/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ const (
)

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

func SplitQueryComponents(query string) (headers []string, varsUDFs []string, queries []string) {
Expand Down Expand Up @@ -227,6 +227,7 @@ func RestoreStringLiteral(query string, placeholders map[string]string) string {
return query
}

func IsDDL(query string) bool {
return ddlPattern.MatchString(query)
func IsDDL(stmt string) bool {
stmtWithoutComment := RemoveComments(stmt)
return ddlPattern.MatchString(strings.TrimSpace(stmtWithoutComment))
}
Loading