aboutsummaryrefslogtreecommitdiff
path: root/weed/query/engine/real_world_where_clause_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/query/engine/real_world_where_clause_test.go')
-rw-r--r--weed/query/engine/real_world_where_clause_test.go220
1 files changed, 220 insertions, 0 deletions
diff --git a/weed/query/engine/real_world_where_clause_test.go b/weed/query/engine/real_world_where_clause_test.go
new file mode 100644
index 000000000..e63c27ab4
--- /dev/null
+++ b/weed/query/engine/real_world_where_clause_test.go
@@ -0,0 +1,220 @@
+package engine
+
+import (
+ "context"
+ "strconv"
+ "testing"
+)
+
+// TestRealWorldWhereClauseFailure demonstrates the exact WHERE clause issue from real usage
+func TestRealWorldWhereClauseFailure(t *testing.T) {
+ engine := NewTestSQLEngine()
+
+ // This test simulates the exact real-world scenario that failed
+ testCases := []struct {
+ name string
+ sql string
+ filterValue int64
+ operator string
+ desc string
+ }{
+ {
+ name: "Where_ID_Greater_Than_Large_Number",
+ sql: "SELECT id FROM user_events WHERE id > 10000000",
+ filterValue: 10000000,
+ operator: ">",
+ desc: "Real-world case: WHERE id > 10000000 should filter results",
+ },
+ {
+ name: "Where_ID_Greater_Than_Small_Number",
+ sql: "SELECT id FROM user_events WHERE id > 100000",
+ filterValue: 100000,
+ operator: ">",
+ desc: "WHERE id > 100000 should filter results",
+ },
+ {
+ name: "Where_ID_Less_Than",
+ sql: "SELECT id FROM user_events WHERE id < 100000",
+ filterValue: 100000,
+ operator: "<",
+ desc: "WHERE id < 100000 should filter results",
+ },
+ }
+
+ t.Log("TESTING REAL-WORLD WHERE CLAUSE SCENARIOS")
+ t.Log("============================================")
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ result, err := engine.ExecuteSQL(context.Background(), tc.sql)
+
+ if err != nil {
+ t.Errorf("Query failed: %v", err)
+ return
+ }
+
+ if result.Error != nil {
+ t.Errorf("Result error: %v", result.Error)
+ return
+ }
+
+ // Analyze the actual results
+ actualRows := len(result.Rows)
+ var matchingRows, nonMatchingRows int
+
+ t.Logf("Query: %s", tc.sql)
+ t.Logf("Total rows returned: %d", actualRows)
+
+ if actualRows > 0 {
+ t.Logf("Sample IDs returned:")
+ sampleSize := 5
+ if actualRows < sampleSize {
+ sampleSize = actualRows
+ }
+
+ for i := 0; i < sampleSize; i++ {
+ idStr := result.Rows[i][0].ToString()
+ if idValue, err := strconv.ParseInt(idStr, 10, 64); err == nil {
+ t.Logf(" Row %d: id = %d", i+1, idValue)
+
+ // Check if this row should have been filtered
+ switch tc.operator {
+ case ">":
+ if idValue > tc.filterValue {
+ matchingRows++
+ } else {
+ nonMatchingRows++
+ }
+ case "<":
+ if idValue < tc.filterValue {
+ matchingRows++
+ } else {
+ nonMatchingRows++
+ }
+ }
+ }
+ }
+
+ // Count all rows for accurate assessment
+ allMatchingRows, allNonMatchingRows := 0, 0
+ for _, row := range result.Rows {
+ idStr := row[0].ToString()
+ if idValue, err := strconv.ParseInt(idStr, 10, 64); err == nil {
+ switch tc.operator {
+ case ">":
+ if idValue > tc.filterValue {
+ allMatchingRows++
+ } else {
+ allNonMatchingRows++
+ }
+ case "<":
+ if idValue < tc.filterValue {
+ allMatchingRows++
+ } else {
+ allNonMatchingRows++
+ }
+ }
+ }
+ }
+
+ t.Logf("Analysis:")
+ t.Logf(" Rows matching WHERE condition: %d", allMatchingRows)
+ t.Logf(" Rows NOT matching WHERE condition: %d", allNonMatchingRows)
+
+ if allNonMatchingRows > 0 {
+ t.Errorf("FAIL: %s - Found %d rows that should have been filtered out", tc.desc, allNonMatchingRows)
+ t.Errorf(" This confirms WHERE clause is being ignored")
+ } else {
+ t.Logf("PASS: %s - All returned rows match the WHERE condition", tc.desc)
+ }
+ } else {
+ t.Logf("No rows returned - this could be correct if no data matches")
+ }
+ })
+ }
+}
+
+// TestWhereClauseWithLimitOffset tests the exact failing scenario
+func TestWhereClauseWithLimitOffset(t *testing.T) {
+ engine := NewTestSQLEngine()
+
+ // The exact query that was failing in real usage
+ sql := "SELECT id FROM user_events WHERE id > 10000000 LIMIT 10 OFFSET 5"
+
+ t.Logf("Testing exact failing query: %s", sql)
+
+ result, err := engine.ExecuteSQL(context.Background(), sql)
+
+ if err != nil {
+ t.Errorf("Query failed: %v", err)
+ return
+ }
+
+ if result.Error != nil {
+ t.Errorf("Result error: %v", result.Error)
+ return
+ }
+
+ actualRows := len(result.Rows)
+ t.Logf("Returned %d rows (LIMIT 10 worked)", actualRows)
+
+ if actualRows > 10 {
+ t.Errorf("LIMIT not working: expected max 10 rows, got %d", actualRows)
+ }
+
+ // Check if WHERE clause worked
+ nonMatchingRows := 0
+ for i, row := range result.Rows {
+ idStr := row[0].ToString()
+ if idValue, err := strconv.ParseInt(idStr, 10, 64); err == nil {
+ t.Logf("Row %d: id = %d", i+1, idValue)
+ if idValue <= 10000000 {
+ nonMatchingRows++
+ }
+ }
+ }
+
+ if nonMatchingRows > 0 {
+ t.Errorf("WHERE clause completely ignored: %d rows have id <= 10000000", nonMatchingRows)
+ t.Log("This matches the real-world failure - WHERE is parsed but not executed")
+ } else {
+ t.Log("WHERE clause working correctly")
+ }
+}
+
+// TestWhatShouldHaveBeenTested creates the test that should have caught the WHERE issue
+func TestWhatShouldHaveBeenTested(t *testing.T) {
+ engine := NewTestSQLEngine()
+
+ t.Log("THE TEST THAT SHOULD HAVE CAUGHT THE WHERE CLAUSE ISSUE")
+ t.Log("========================================================")
+
+ // Test 1: Simple WHERE that should return subset
+ result1, _ := engine.ExecuteSQL(context.Background(), "SELECT id FROM user_events")
+ allRowCount := len(result1.Rows)
+
+ result2, _ := engine.ExecuteSQL(context.Background(), "SELECT id FROM user_events WHERE id > 999999999")
+ filteredCount := len(result2.Rows)
+
+ t.Logf("All rows: %d", allRowCount)
+ t.Logf("WHERE id > 999999999: %d rows", filteredCount)
+
+ if filteredCount == allRowCount {
+ t.Error("CRITICAL ISSUE: WHERE clause completely ignored")
+ t.Error("Expected: Fewer rows after WHERE filtering")
+ t.Error("Actual: Same number of rows (no filtering occurred)")
+ t.Error("This is the bug that our tests should have caught!")
+ }
+
+ // Test 2: Impossible WHERE condition
+ result3, _ := engine.ExecuteSQL(context.Background(), "SELECT id FROM user_events WHERE 1 = 0")
+ impossibleCount := len(result3.Rows)
+
+ t.Logf("WHERE 1 = 0 (impossible): %d rows", impossibleCount)
+
+ if impossibleCount > 0 {
+ t.Error("CRITICAL ISSUE: Even impossible WHERE conditions ignored")
+ t.Error("Expected: 0 rows")
+ t.Errorf("Actual: %d rows", impossibleCount)
+ }
+}