| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -186,6 +186,7 @@ func (v ValTuple) isExprNode() {} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					const ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						IntVal = iota | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						StrVal | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						FloatVal | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Operator constants
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -319,9 +320,64 @@ func convertExpressionNode(node *pg_query.Node) ExprNode { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return nil | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Handle different expression types
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Handle A_Expr nodes (comparison operations: >, <, =, etc.)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if aExpr := node.GetAExpr(); aExpr != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							left := convertExpressionNode(aExpr.GetLexpr()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							right := convertExpressionNode(aExpr.GetRexpr()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Convert operator name
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							operator := "" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if len(aExpr.GetName()) > 0 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								opName := aExpr.GetName()[0].GetString_().GetSval() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								switch opName { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case ">": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = GreaterThanStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case "<": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = LessThanStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case ">=": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = GreaterEqualStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case "<=": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = LessEqualStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case "=": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = EqualStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case "<>", "!=": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = NotEqualStr | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								default: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									operator = opName | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return &ComparisonExpr{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								Left:     left, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								Right:    right, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								Operator: operator, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Handle BoolExpr nodes (AND, OR operations)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if boolExpr := node.GetBoolExpr(); boolExpr != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							args := boolExpr.GetArgs() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if len(args) >= 2 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								left := convertExpressionNode(args[0]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								right := convertExpressionNode(args[1]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								switch boolExpr.GetBoolop() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case pg_query.BoolExprType_AND_EXPR: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									return &AndExpr{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Left:  left, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Right: right, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case pg_query.BoolExprType_OR_EXPR: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									return &OrExpr{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Left:  left, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Right: right, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Handle constants
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if aConst := node.GetAConst(); aConst != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Handle constants (numbers, strings)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if aConst.GetIval() != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return &SQLVal{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									Type: IntVal, | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -334,21 +390,30 @@ func convertExpressionNode(node *pg_query.Node) ExprNode { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									Val:  []byte(aConst.GetSval().GetSval()), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if aConst.GetFval() != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return &SQLVal{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									Type: FloatVal, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									Val:  []byte(aConst.GetFval().GetFval()), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Handle column references
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if columnRef := node.GetColumnRef(); columnRef != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Handle column references
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return &ColName{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								Name: stringValue("column"), // Simplified - would need more complex parsing
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							fields := columnRef.GetFields() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if len(fields) > 0 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								// Extract column name from the first field
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if stringNode := fields[0].GetString_(); stringNode != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									return &ColName{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Name: stringValue(stringNode.GetSval()), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// For now, return a simple placeholder for other expression types
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// In a full implementation, we'd handle all PostgreSQL expression types
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return &SQLVal{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Type: StrVal, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							Val:  []byte(""), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Return nil for unsupported expression types instead of a placeholder
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// This will help identify what still needs to be implemented
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return nil | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					func parseCreateTableFromSQL(sql string) (*DDLStatement, error) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1713,6 +1778,12 @@ func (e *SQLEngine) extractComparisonValue(expr ExprNode) (interface{}, error) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return intVal, nil | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case StrVal: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return string(val.Val), nil | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case FloatVal: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								floatVal, err := strconv.ParseFloat(string(val.Val), 64) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if err != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									return nil, err | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return floatVal, nil | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							default: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return nil, fmt.Errorf("unsupported SQL value type: %v", val.Type) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1731,6 +1802,12 @@ func (e *SQLEngine) extractComparisonValue(expr ExprNode) (interface{}, error) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										inValues = append(inValues, intVal) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									case StrVal: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										inValues = append(inValues, string(v.Val)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									case FloatVal: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										floatVal, err := strconv.ParseFloat(string(v.Val), 64) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										if err != nil { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
											return nil, err | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										inValues = append(inValues, floatVal) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |