index_predicate_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package executor
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestIndexPredicateMatchesScan(t *testing.T) {
  7. _, schema, table := newTestDB(t)
  8. e := newExec(schema, table)
  9. execMust(t, e, "CREATE TABLE t (id INTEGER PRIMARY KEY, v REAL, txt TEXT)")
  10. execMust(t, e, "INSERT INTO t VALUES (1,1.0000001,'01'),(2,1.0000002,'1'),(3,NULL,'other')")
  11. queries := []string{
  12. "SELECT id FROM t WHERE v=1.0000001 ORDER BY id",
  13. "SELECT id FROM t WHERE v=NULL ORDER BY id",
  14. "SELECT id FROM t WHERE 1.0000002=v ORDER BY id",
  15. "SELECT id FROM t WHERE txt='1' ORDER BY id",
  16. "SELECT id FROM t WHERE id=NULL ORDER BY id",
  17. "SELECT id FROM t AS x WHERE x.v=1.0000001 ORDER BY id",
  18. }
  19. want := make([][][]interface{}, len(queries))
  20. for i, q := range queries {
  21. want[i] = execMust(t, e, q).Rows
  22. }
  23. execMust(t, e, "CREATE INDEX v_idx ON t(v)")
  24. execMust(t, e, "CREATE INDEX txt_idx ON t(txt)")
  25. for _, tx := range []bool{false, true} {
  26. if tx {
  27. execMust(t, e, "BEGIN")
  28. }
  29. for i, q := range queries {
  30. if got := execMust(t, e, q).Rows; !reflect.DeepEqual(got, want[i]) {
  31. t.Errorf("tx=%v %s: got %v want %v", tx, q, got, want[i])
  32. }
  33. }
  34. if tx {
  35. execMust(t, e, "ROLLBACK")
  36. }
  37. }
  38. }
  39. func TestQualifiedJoinPredicateDoesNotRestrictLeftTable(t *testing.T) {
  40. _, schema, table := newTestDB(t)
  41. e := newExec(schema, table)
  42. execMust(t, e, "CREATE TABLE lhs (id INTEGER PRIMARY KEY, x INTEGER)")
  43. execMust(t, e, "CREATE TABLE rhs (id INTEGER PRIMARY KEY, x INTEGER)")
  44. execMust(t, e, "INSERT INTO lhs VALUES (1,7),(2,7)")
  45. execMust(t, e, "INSERT INTO rhs VALUES (1,7)")
  46. for _, join := range []string{"JOIN", "LEFT JOIN"} {
  47. q := "SELECT lhs.id,rhs.id FROM lhs " + join + " rhs ON lhs.x=rhs.x WHERE rhs.id=1 ORDER BY lhs.id"
  48. got := execMust(t, e, q).Rows
  49. want := [][]interface{}{{int64(1), int64(1)}, {int64(2), int64(1)}}
  50. if !reflect.DeepEqual(got, want) {
  51. t.Fatalf("%s: got %v want %v", q, got, want)
  52. }
  53. }
  54. }