You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							79 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							79 lines
						
					
					
						
							2.0 KiB
						
					
					
				
								package engine
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"context"
							 | 
						|
									"testing"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// TestArithmeticWithFunctions tests arithmetic operations with function calls
							 | 
						|
								// This validates the complete AST parser and evaluation system for column-level calculations
							 | 
						|
								func TestArithmeticWithFunctions(t *testing.T) {
							 | 
						|
									engine := NewTestSQLEngine()
							 | 
						|
								
							 | 
						|
									testCases := []struct {
							 | 
						|
										name     string
							 | 
						|
										sql      string
							 | 
						|
										expected string
							 | 
						|
										desc     string
							 | 
						|
									}{
							 | 
						|
										{
							 | 
						|
											name:     "Simple function arithmetic",
							 | 
						|
											sql:      "SELECT LENGTH('hello') + 10 FROM user_events LIMIT 1",
							 | 
						|
											expected: "15",
							 | 
						|
											desc:     "Basic function call with addition",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:     "Nested functions with arithmetic",
							 | 
						|
											sql:      "SELECT length(trim('  hello world  ')) + 12 FROM user_events LIMIT 1",
							 | 
						|
											expected: "23",
							 | 
						|
											desc:     "Complex nested functions with arithmetic operation (user's original failing query)",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:     "Function subtraction",
							 | 
						|
											sql:      "SELECT LENGTH('programming') - 5 FROM user_events LIMIT 1",
							 | 
						|
											expected: "6",
							 | 
						|
											desc:     "Function call with subtraction",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:     "Function multiplication",
							 | 
						|
											sql:      "SELECT LENGTH('test') * 3 FROM user_events LIMIT 1",
							 | 
						|
											expected: "12",
							 | 
						|
											desc:     "Function call with multiplication",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:     "Multiple nested functions",
							 | 
						|
											sql:      "SELECT LENGTH(UPPER(TRIM('  hello  '))) FROM user_events LIMIT 1",
							 | 
						|
											expected: "5",
							 | 
						|
											desc:     "Triple nested functions",
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									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("Query result error: %v", result.Error)
							 | 
						|
												return
							 | 
						|
											}
							 | 
						|
								
							 | 
						|
											if len(result.Rows) == 0 {
							 | 
						|
												t.Error("Expected at least one row")
							 | 
						|
												return
							 | 
						|
											}
							 | 
						|
								
							 | 
						|
											actual := result.Rows[0][0].ToString()
							 | 
						|
								
							 | 
						|
											if actual != tc.expected {
							 | 
						|
												t.Errorf("%s: Expected '%s', got '%s'", tc.desc, tc.expected, actual)
							 | 
						|
											} else {
							 | 
						|
												t.Logf("PASS %s: %s → %s", tc.desc, tc.sql, actual)
							 | 
						|
											}
							 | 
						|
										})
							 | 
						|
									}
							 | 
						|
								}
							 |