query_unknown_field_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package DB
  2. import (
  3. "path/filepath"
  4. "strings"
  5. "testing"
  6. )
  7. // TestQueryUnknownFieldReturnsError 回归测试: Where / OrderBy / Select 传了
  8. // 不存在的字段名, 执行入口 (Find / First / Count / Scan) 必须返回带字段名的
  9. // 错误, 而不是静默给出错数据:
  10. // - Where("不存在的字段","!=",x): != 翻成 Not(Eq(...)), 未知字段的 Eq 恒 false,
  11. // 取反恒 true —— 旧实现静默返回全表;
  12. // - OrderBy("不存在的字段"): 旧实现静默不排序。
  13. //
  14. // 这是有意为之的行为变更 (以前"未知字段静默查不到"), README 的字段名约定
  15. // 一节已同步更新。
  16. func TestQueryUnknownFieldReturnsError(t *testing.T) {
  17. db, err := Open(filepath.Join(t.TempDir(), "q_unknown.db"))
  18. if err != nil {
  19. t.Fatalf("打开: %v", err)
  20. }
  21. defer func() { _ = db.Close() }()
  22. db.SetAutoCommitDelay(0)
  23. tbl, err := UseTable[biRow](db, "qunk")
  24. if err != nil {
  25. t.Fatalf("建表: %v", err)
  26. }
  27. for i := 0; i < 20; i++ {
  28. if err := tbl.Insert(biMake(i)); err != nil {
  29. t.Fatalf("预置 %d: %v", i, err)
  30. }
  31. }
  32. if err := db.Commit(); err != nil {
  33. t.Fatalf("提交: %v", err)
  34. }
  35. assertUnknownField := func(what string, err error) {
  36. t.Helper()
  37. if err == nil {
  38. t.Fatalf("%s: 应返回未知字段错误, 却返回 nil", what)
  39. }
  40. if !strings.Contains(err.Error(), "NotAField") {
  41. t.Fatalf("%s: 错误应包含字段名 NotAField, 得到: %v", what, err)
  42. }
  43. }
  44. // != 是最危险的入口: 旧实现静默返回全表 (20 行), 必须报错
  45. rows, err := tbl.Where("NotAField", "!=", int64(1)).Find()
  46. if err == nil {
  47. t.Fatalf("Where(!=) 未知字段: 应报错, 实际静默返回 %d 行 (全表)", len(rows))
  48. }
  49. assertUnknownField("Where(!=).Find", err)
  50. // 其余执行入口同样要拦
  51. _, err = tbl.Where("NotAField", "=", int64(1)).Find()
  52. assertUnknownField("Where(=).Find", err)
  53. _, err = tbl.Where("NotAField", "=", int64(1)).First()
  54. assertUnknownField("Where.First", err)
  55. _, err = tbl.Where("NotAField", "=", int64(1)).Count()
  56. assertUnknownField("Where.Count", err)
  57. err = tbl.Query().Where("NotAField", "=", int64(1)).Scan(func(*biRow) bool { return true })
  58. assertUnknownField("Where.Scan", err)
  59. // OrderBy: 旧实现静默不排序
  60. _, err = tbl.Query().OrderBy("NotAField").Find()
  61. assertUnknownField("Query.OrderBy.Find", err)
  62. _, err = tbl.OrderBy("NotAField").Find()
  63. assertUnknownField("Table.OrderBy.Find", err)
  64. // Select 投影未知列
  65. _, err = tbl.Query().Select("NotAField").Find()
  66. assertUnknownField("Select.Find", err)
  67. // 多错聚合: Where 与 OrderBy 都传错字段, 两条错误都要能在 err 里看到
  68. _, err = tbl.Query().Where("BadWhere", "=", 1).OrderBy("BadOrder").Find()
  69. if err == nil {
  70. t.Fatal("多错聚合: 应报错")
  71. }
  72. if !strings.Contains(err.Error(), "BadWhere") || !strings.Contains(err.Error(), "BadOrder") {
  73. t.Fatalf("多错聚合: 错误应同时包含 BadWhere 与 BadOrder, 得到: %v", err)
  74. }
  75. // 对照: 合法字段照常工作, 行为不受校验影响
  76. got, err := tbl.Query().Where("Age", ">", int64(0)).OrderBy("Age").Limit(5).Find()
  77. if err != nil {
  78. t.Fatalf("合法字段查询应正常: %v", err)
  79. }
  80. if len(got) != 5 {
  81. t.Fatalf("合法字段查询: 期望 5 行, 实际 %d", len(got))
  82. }
  83. // 列名显式改过时, 自定义列名是合法入口 (不是未知字段)
  84. if _, err := tbl.Where("Age", "=", int64(20)).Count(); err != nil {
  85. t.Fatalf("Age 索引列查询应正常: %v", err)
  86. }
  87. }