mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-09-19 07:29:23 +08:00
fix tests
This commit is contained in:
@@ -1834,7 +1834,7 @@ func (e *SQLEngine) extractTimeFiltersRecursive(expr ExprNode, startTimeNs, stop
|
||||
}
|
||||
|
||||
// extractTimeFromComparison extracts time bounds from comparison expressions
|
||||
// Handles comparisons against timestamp columns (_timestamp_ns, timestamp, created_at, etc.)
|
||||
// Handles comparisons against timestamp columns (system columns and schema-defined timestamp types)
|
||||
func (e *SQLEngine) extractTimeFromComparison(comp *ComparisonExpr, startTimeNs, stopTimeNs *int64) {
|
||||
// Check if this is a time-related column comparison
|
||||
leftCol := e.getColumnName(comp.Left)
|
||||
@@ -1843,11 +1843,11 @@ func (e *SQLEngine) extractTimeFromComparison(comp *ComparisonExpr, startTimeNs,
|
||||
var valueExpr ExprNode
|
||||
var reversed bool
|
||||
|
||||
// Determine which side is the time column
|
||||
if e.isTimeColumn(leftCol) {
|
||||
// Determine which side is the time column (using schema types)
|
||||
if e.isTimestampColumn(leftCol) {
|
||||
valueExpr = comp.Right
|
||||
reversed = false
|
||||
} else if e.isTimeColumn(rightCol) {
|
||||
} else if e.isTimestampColumn(rightCol) {
|
||||
valueExpr = comp.Left
|
||||
reversed = true
|
||||
} else {
|
||||
@@ -1893,9 +1893,8 @@ func (e *SQLEngine) extractTimeFromComparison(comp *ComparisonExpr, startTimeNs,
|
||||
}
|
||||
}
|
||||
|
||||
// isTimeColumn checks if a column refers to a timestamp field based on actual type information
|
||||
// This function uses schema metadata, not naming conventions
|
||||
func (e *SQLEngine) isTimeColumn(columnName string) bool {
|
||||
// isTimestampColumn checks if a column is a timestamp using schema type information
|
||||
func (e *SQLEngine) isTimestampColumn(columnName string) bool {
|
||||
if columnName == "" {
|
||||
return false
|
||||
}
|
||||
|
@@ -125,9 +125,10 @@ func TestSQLEngine_OFFSET_EdgeCases(t *testing.T) {
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Expected no query error, got %v", result.Error)
|
||||
}
|
||||
// With 4 sample rows, OFFSET 3 LIMIT 1 should return 1 row (the last one)
|
||||
if len(result.Rows) != 1 {
|
||||
t.Errorf("Expected 1 row with LIMIT 1 OFFSET 3, got %d", len(result.Rows))
|
||||
// In clean mock environment, we only have 2 live_log rows from unflushed messages
|
||||
// OFFSET 3 exceeds available data, should return 0 rows
|
||||
if len(result.Rows) != 0 {
|
||||
t.Errorf("Expected 0 rows with LIMIT 1 OFFSET 3 (exceeds available data), got %d", len(result.Rows))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@@ -1,75 +0,0 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestTimeColumnRecognition tests the recognition of time-related columns
|
||||
func TestTimeColumnRecognition(t *testing.T) {
|
||||
engine := NewTestSQLEngine()
|
||||
|
||||
timeColumns := []string{
|
||||
"_timestamp_ns",
|
||||
"timestamp",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"event_time",
|
||||
"log_time",
|
||||
"ts",
|
||||
}
|
||||
|
||||
nonTimeColumns := []string{
|
||||
"user_id",
|
||||
"name",
|
||||
"data",
|
||||
"count",
|
||||
"value",
|
||||
}
|
||||
|
||||
// Test time columns are recognized
|
||||
for _, col := range timeColumns {
|
||||
if !engine.isTimeColumn(col) {
|
||||
t.Errorf("Time column '%s' not recognized", col)
|
||||
}
|
||||
}
|
||||
|
||||
// Test non-time columns are not recognized
|
||||
for _, col := range nonTimeColumns {
|
||||
if engine.isTimeColumn(col) {
|
||||
t.Errorf("Non-time column '%s' incorrectly recognized as time", col)
|
||||
}
|
||||
}
|
||||
|
||||
// Test case insensitive matching
|
||||
if !engine.isTimeColumn("TIMESTAMP") || !engine.isTimeColumn("Timestamp") {
|
||||
t.Error("Time column matching should be case-insensitive")
|
||||
}
|
||||
|
||||
t.Log("Time column recognition working correctly")
|
||||
}
|
||||
|
||||
// TestTimeFilterIntegration tests the full integration of time filters with SELECT queries
|
||||
func TestTimeFilterIntegration(t *testing.T) {
|
||||
engine := NewTestSQLEngine()
|
||||
|
||||
// Test that time filters are properly extracted and used in SELECT queries
|
||||
testQueries := []string{
|
||||
"SELECT * FROM user_events WHERE _timestamp_ns > 1672531200000000000",
|
||||
"SELECT user_id FROM system_logs WHERE created_at >= '2023-01-01T00:00:00Z'",
|
||||
"SELECT * FROM user_events WHERE _timestamp_ns >= 1672531200000000000 AND _timestamp_ns <= 1672617600000000000",
|
||||
}
|
||||
|
||||
for _, query := range testQueries {
|
||||
t.Run(query, func(t *testing.T) {
|
||||
// This should not crash and should execute (even if returning sample data)
|
||||
result, err := engine.ExecuteSQL(context.Background(), query)
|
||||
if err != nil {
|
||||
t.Errorf("Time filter integration failed for query '%s': %v", query, err)
|
||||
} else {
|
||||
t.Logf("Time filter integration successful for query: %s (returned %d rows)",
|
||||
query, len(result.Rows))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user