You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							4.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							147 lines
						
					
					
						
							4.5 KiB
						
					
					
				| package sqlutil | |
| 
 | |
| import ( | |
| 	"reflect" | |
| 	"testing" | |
| ) | |
| 
 | |
| func TestSplitStatements(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", "SELECT * FROM orders"}, | |
| 		}, | |
| 		{ | |
| 			name:     "Single line comment with semicolon", | |
| 			input:    "SELECT * FROM users; -- Comment with; semicolon\nSELECT * FROM orders;", | |
| 			expected: []string{"SELECT * FROM users", "SELECT * FROM orders"}, | |
| 		}, | |
| 		{ | |
| 			name:     "Multi-line comment", | |
| 			input:    "SELECT * FROM users; /* Multi-line\ncomment */ SELECT * FROM orders;", | |
| 			expected: []string{"SELECT * FROM users", "SELECT * FROM orders"}, | |
| 		}, | |
| 		{ | |
| 			name:     "Multi-line comment with semicolon", | |
| 			input:    "SELECT * FROM users; /* Comment with; semicolon */ SELECT * FROM orders;", | |
| 			expected: []string{"SELECT * FROM users", "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`, | |
| 				`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 := SplitStatements(tt.input) | |
| 			if !reflect.DeepEqual(result, tt.expected) { | |
| 				t.Errorf("SplitStatements() = %v, expected %v", result, tt.expected) | |
| 			} | |
| 		}) | |
| 	} | |
| } | |
| 
 | |
| func TestSplitStatements_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", "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"}, | |
| 		}, | |
| 		{ | |
| 			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 := SplitStatements(tt.input) | |
| 			if !reflect.DeepEqual(result, tt.expected) { | |
| 				t.Errorf("SplitStatements() = %v, expected %v", result, tt.expected) | |
| 			} | |
| 		}) | |
| 	} | |
| }
 |