2 changed files with 251 additions and 21 deletions
@ -0,0 +1,149 @@ |
|||||
|
package command |
||||
|
|
||||
|
import ( |
||||
|
"reflect" |
||||
|
"testing" |
||||
|
) |
||||
|
|
||||
|
func TestSplitSQLStatements(t *testing.T) { |
||||
|
tests := []struct { |
||||
|
name string |
||||
|
input string |
||||
|
expected []string |
||||
|
}{ |
||||
|
{ |
||||
|
name: "Simple single statement", |
||||
|
input: "SELECT * FROM users", |
||||
|
expected: []string{"SELECT * FROM users"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Multiple statements", |
||||
|
input: "SELECT * FROM users; SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Semicolon in single quotes", |
||||
|
input: "SELECT 'hello;world' FROM users; SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT 'hello;world' FROM users", "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Semicolon in double quotes", |
||||
|
input: `SELECT "column;name" FROM users; SELECT * FROM orders;`, |
||||
|
expected: []string{`SELECT "column;name" FROM users`, "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Escaped quotes in strings", |
||||
|
input: `SELECT 'don''t split; here' FROM users; SELECT * FROM orders;`, |
||||
|
expected: []string{`SELECT 'don''t split; here' FROM users`, "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Escaped quotes in identifiers", |
||||
|
input: `SELECT "column""name" FROM users; SELECT * FROM orders;`, |
||||
|
expected: []string{`SELECT "column""name" FROM users`, "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Single line comment", |
||||
|
input: "SELECT * FROM users; -- This is a comment\nSELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "-- This is a comment\nSELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Single line comment with semicolon", |
||||
|
input: "SELECT * FROM users; -- Comment with; semicolon\nSELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "-- Comment with; semicolon\nSELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Multi-line comment", |
||||
|
input: "SELECT * FROM users; /* Multi-line\ncomment */ SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "/* Multi-line\ncomment */ SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Multi-line comment with semicolon", |
||||
|
input: "SELECT * FROM users; /* Comment with; semicolon */ SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "/* Comment with; semicolon */ SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Complex mixed case", |
||||
|
input: `SELECT 'test;string', "quoted;id" FROM users; -- Comment; here |
||||
|
/* Another; comment */ |
||||
|
INSERT INTO users VALUES ('name''s value', "id""field");`, |
||||
|
expected: []string{ |
||||
|
`SELECT 'test;string', "quoted;id" FROM users`, |
||||
|
`-- Comment; here |
||||
|
/* Another; comment */ |
||||
|
INSERT INTO users VALUES ('name''s value', "id""field")`, |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Empty statements filtered", |
||||
|
input: "SELECT * FROM users;;; SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Whitespace handling", |
||||
|
input: " SELECT * FROM users ; SELECT * FROM orders ; ", |
||||
|
expected: []string{"SELECT * FROM users", "SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Single statement without semicolon", |
||||
|
input: "SELECT * FROM users", |
||||
|
expected: []string{"SELECT * FROM users"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Empty query", |
||||
|
input: "", |
||||
|
expected: []string{}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Only whitespace", |
||||
|
input: " \n\t ", |
||||
|
expected: []string{}, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
for _, tt := range tests { |
||||
|
t.Run(tt.name, func(t *testing.T) { |
||||
|
result := splitSQLStatements(tt.input) |
||||
|
if !reflect.DeepEqual(result, tt.expected) { |
||||
|
t.Errorf("splitSQLStatements() = %v, expected %v", result, tt.expected) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func TestSplitSQLStatements_EdgeCases(t *testing.T) { |
||||
|
tests := []struct { |
||||
|
name string |
||||
|
input string |
||||
|
expected []string |
||||
|
}{ |
||||
|
{ |
||||
|
name: "Nested comments are not supported but handled gracefully", |
||||
|
input: "SELECT * FROM users; /* Outer /* inner */ comment */ SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT * FROM users", "/* Outer /* inner */ comment */ SELECT * FROM orders"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Unterminated string (malformed SQL)", |
||||
|
input: "SELECT 'unterminated string; SELECT * FROM orders;", |
||||
|
expected: []string{"SELECT 'unterminated string; SELECT * FROM orders;"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Unterminated comment (malformed SQL)", |
||||
|
input: "SELECT * FROM users; /* unterminated comment", |
||||
|
expected: []string{"SELECT * FROM users", "/* unterminated comment"}, |
||||
|
}, |
||||
|
{ |
||||
|
name: "Multiple semicolons in quotes", |
||||
|
input: "SELECT ';;;' FROM users; SELECT ';;;' FROM orders;", |
||||
|
expected: []string{"SELECT ';;;' FROM users", "SELECT ';;;' FROM orders"}, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
for _, tt := range tests { |
||||
|
t.Run(tt.name, func(t *testing.T) { |
||||
|
result := splitSQLStatements(tt.input) |
||||
|
if !reflect.DeepEqual(result, tt.expected) { |
||||
|
t.Errorf("splitSQLStatements() = %v, expected %v", result, tt.expected) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue