| 2362 | } |
| 2363 | |
| 2364 | func TestParseError(t *testing.T) { |
| 2365 | testData := []struct { |
| 2366 | sql string |
| 2367 | expected string |
| 2368 | }{ |
| 2369 | {`SELECT2 1`, |
| 2370 | `at or near "select2": syntax error |
| 2371 | DETAIL: source SQL: |
| 2372 | SELECT2 1 |
| 2373 | ^`}, |
| 2374 | {`SELECT 1 FROM (t)`, |
| 2375 | `at or near ")": syntax error |
| 2376 | DETAIL: source SQL: |
| 2377 | SELECT 1 FROM (t) |
| 2378 | ^ |
| 2379 | HINT: try \h <SOURCE>`}, |
| 2380 | {`SET TIME ZONE INTERVAL 'foobar'`, |
| 2381 | `at or near "EOF": syntax error: could not parse "foobar" as type interval: interval: missing unit at position 0: "foobar" |
| 2382 | DETAIL: source SQL: |
| 2383 | SET TIME ZONE INTERVAL 'foobar' |
| 2384 | ^`}, |
| 2385 | {`SELECT INTERVAL 'foo'`, |
| 2386 | `at or near "EOF": syntax error: could not parse "foo" as type interval: interval: missing unit at position 0: "foo" |
| 2387 | DETAIL: source SQL: |
| 2388 | SELECT INTERVAL 'foo' |
| 2389 | ^`}, |
| 2390 | {`SELECT 1 /* hello`, |
| 2391 | `lexical error: unterminated comment |
| 2392 | DETAIL: source SQL: |
| 2393 | SELECT 1 /* hello |
| 2394 | ^`}, |
| 2395 | {`SELECT '1`, |
| 2396 | `lexical error: unterminated string |
| 2397 | DETAIL: source SQL: |
| 2398 | SELECT '1 |
| 2399 | ^ |
| 2400 | HINT: try \h SELECT`}, |
| 2401 | {`SELECT * FROM t WHERE k=`, |
| 2402 | `at or near "EOF": syntax error |
| 2403 | DETAIL: source SQL: |
| 2404 | SELECT * FROM t WHERE k= |
| 2405 | ^ |
| 2406 | HINT: try \h SELECT`, |
| 2407 | }, |
| 2408 | {`CREATE TABLE test ( |
| 2409 | CONSTRAINT foo INDEX (bar) |
| 2410 | )`, |
| 2411 | `at or near "index": syntax error |
| 2412 | DETAIL: source SQL: |
| 2413 | CREATE TABLE test ( |
| 2414 | CONSTRAINT foo INDEX (bar) |
| 2415 | ^ |
| 2416 | HINT: try \h CREATE TABLE`}, |
| 2417 | {`CREATE TABLE test ( |
| 2418 | foo BIT(0) |
| 2419 | )`, |
| 2420 | `at or near ")": syntax error: length for type bit must be at least 1 |
| 2421 | DETAIL: source SQL: |