2
0

features_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package analyzer
  2. import "testing"
  3. func analyze(t *testing.T, a *Analyzer, sql string) error {
  4. t.Helper()
  5. return a.Analyze(parse(t, sql))
  6. }
  7. func TestAnalyzeBitwiseOperators(t *testing.T) {
  8. a := New(setupCatalog())
  9. for _, sql := range []string{
  10. "SELECT age & 3 FROM users",
  11. "SELECT age | 3 FROM users",
  12. "SELECT age << 1 FROM users",
  13. "SELECT age >> 1 FROM users",
  14. "SELECT ~age FROM users",
  15. } {
  16. if err := analyze(t, a, sql); err != nil {
  17. t.Errorf("%s: unexpected error: %v", sql, err)
  18. }
  19. }
  20. }
  21. func TestAnalyzeJSONAndPercentDiffFunctions(t *testing.T) {
  22. a := New(setupCatalog())
  23. for _, sql := range []string{
  24. `SELECT json('[1,2]')`,
  25. `SELECT json_extract('{"a":1}', '$.a')`,
  26. `SELECT json_set('{}', '$.a', 1)`,
  27. `SELECT json_insert('[]', '$[#]', json('1'))`,
  28. `SELECT json_replace('{"a":1}', '$.a', 2)`,
  29. `SELECT json_group_array(id) FROM users`,
  30. `SELECT percent_diff(1, 2)`,
  31. } {
  32. if err := analyze(t, a, sql); err != nil {
  33. t.Errorf("%s: unexpected error: %v", sql, err)
  34. }
  35. }
  36. }
  37. func TestAnalyzeReturning(t *testing.T) {
  38. a := New(setupCatalog())
  39. for _, sql := range []string{
  40. "INSERT INTO users (name) VALUES ('x') RETURNING id, name",
  41. "UPDATE users SET name = 'y' RETURNING id",
  42. "DELETE FROM users WHERE id = 1 RETURNING *",
  43. } {
  44. if err := analyze(t, a, sql); err != nil {
  45. t.Errorf("%s: unexpected error: %v", sql, err)
  46. }
  47. }
  48. }
  49. func TestAnalyzeIsDistinctFromAndAnalyze(t *testing.T) {
  50. a := New(setupCatalog())
  51. for _, sql := range []string{
  52. "SELECT age IS DISTINCT FROM 1 FROM users",
  53. "SELECT age IS NOT DISTINCT FROM 1 FROM users",
  54. "ANALYZE",
  55. "ANALYZE users",
  56. } {
  57. if err := analyze(t, a, sql); err != nil {
  58. t.Errorf("%s: unexpected error: %v", sql, err)
  59. }
  60. }
  61. }
  62. func TestAnalyzeUpdateFrom(t *testing.T) {
  63. a := New(setupCatalog())
  64. // orders.user_id joins users.id; the derived table exposes a count column.
  65. err := analyze(t, a, `WITH x AS (SELECT count(*) AS n, id FROM users GROUP BY id)
  66. UPDATE orders SET status = 'y' FROM x WHERE x.id = orders.user_id`)
  67. if err != nil {
  68. t.Fatalf("UPDATE ... FROM should analyze: %v", err)
  69. }
  70. }
  71. func TestAnalyzeGeneratedColumns(t *testing.T) {
  72. catalog := setupCatalog()
  73. catalog.CreateTable(&TableInfo{
  74. Name: "metrics",
  75. Columns: []ColumnInfo{
  76. {Name: "a", Type: TypeInteger, Nullable: true},
  77. {Name: "b", Type: TypeInteger, Nullable: true, Generated: true},
  78. },
  79. })
  80. a := New(catalog)
  81. if err := analyze(t, a, "INSERT INTO metrics (a, b) VALUES (1, 2)"); err == nil {
  82. t.Fatal("expected generated-column insert to be rejected")
  83. }
  84. if err := analyze(t, a, "UPDATE metrics SET b = 2"); err == nil {
  85. t.Fatal("expected generated-column update to be rejected")
  86. }
  87. if err := analyze(t, a, "INSERT INTO metrics (a) VALUES (1)"); err != nil {
  88. t.Fatalf("plain insert should analyze: %v", err)
  89. }
  90. }