collect_refs_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package executor
  2. import (
  3. "testing"
  4. "github.com/danfragoso/pizzasql-next/pkg/lexer"
  5. "github.com/danfragoso/pizzasql-next/pkg/parser"
  6. )
  7. func TestCollectColumnRefsWithExists(t *testing.T) {
  8. sql := "SELECT * FROM t1 WHERE EXISTS(SELECT 1 FROM t1 AS x WHERE x.b<t1.b)"
  9. l := lexer.New(sql)
  10. p := parser.New(l)
  11. stmt, err := p.Parse()
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. sel := stmt.(*parser.SelectStmt)
  16. refs := collectColumnRefs(sel.Where)
  17. t.Logf("WHERE type: %T", sel.Where)
  18. t.Logf("Column refs: %v", refs)
  19. t.Logf("Ref count: %d", len(refs))
  20. if len(refs) == 0 {
  21. t.Error("Expected non-empty refs for EXISTS clause, got 0")
  22. }
  23. hasSubquery := false
  24. for _, ref := range refs {
  25. if ref == "__subquery__" {
  26. hasSubquery = true
  27. break
  28. }
  29. }
  30. if !hasSubquery {
  31. t.Error("Expected __subquery__ sentinel in refs, but didn't find it")
  32. }
  33. }
  34. func TestCollectColumnRefsWithSubquery(t *testing.T) {
  35. sql := "SELECT c FROM t1 WHERE c>(SELECT avg(c) FROM t1)"
  36. l := lexer.New(sql)
  37. p := parser.New(l)
  38. stmt, err := p.Parse()
  39. if err != nil {
  40. t.Fatal(err)
  41. }
  42. sel := stmt.(*parser.SelectStmt)
  43. refs := collectColumnRefs(sel.Where)
  44. t.Logf("WHERE type: %T", sel.Where)
  45. t.Logf("Column refs: %v", refs)
  46. t.Logf("Ref count: %d", len(refs))
  47. // Should have "c" and "__subquery__"
  48. if len(refs) < 2 {
  49. t.Errorf("Expected at least 2 refs (column and subquery sentinel), got %d", len(refs))
  50. }
  51. hasSubquery := false
  52. hasColumn := false
  53. for _, ref := range refs {
  54. if ref == "__subquery__" {
  55. hasSubquery = true
  56. }
  57. if ref == "c" {
  58. hasColumn = true
  59. }
  60. }
  61. if !hasSubquery {
  62. t.Error("Expected __subquery__ sentinel in refs")
  63. }
  64. if !hasColumn {
  65. t.Error("Expected column 'c' in refs")
  66. }
  67. }