PutExpression returns any Expression to the appropriate pool with iterative cleanup. PutExpression is the primary function for returning expression nodes to their respective pools. It handles all expression types and uses iterative cleanup to prevent stack overflow with deeply nested expression tre
(expr Expression)
| 860 | // |
| 861 | // See also: GetBinaryExpression(), GetFunctionCall(), GetIdentifier() |
| 862 | func PutExpression(expr Expression) { |
| 863 | if expr == nil { |
| 864 | return |
| 865 | } |
| 866 | |
| 867 | // Use a work queue for iterative cleanup instead of recursion |
| 868 | workQueue := make([]Expression, 0, 32) |
| 869 | workQueue = append(workQueue, expr) |
| 870 | |
| 871 | processed := 0 |
| 872 | for len(workQueue) > 0 && processed < MaxWorkQueueSize { |
| 873 | // Pop from queue |
| 874 | current := workQueue[len(workQueue)-1] |
| 875 | workQueue = workQueue[:len(workQueue)-1] |
| 876 | processed++ |
| 877 | |
| 878 | if current == nil { |
| 879 | continue |
| 880 | } |
| 881 | |
| 882 | // Process and collect child expressions |
| 883 | switch e := current.(type) { |
| 884 | case *Identifier: |
| 885 | e.Name = "" |
| 886 | identifierPool.Put(e) |
| 887 | |
| 888 | case *BinaryExpression: |
| 889 | if e.Left != nil { |
| 890 | workQueue = append(workQueue, e.Left) |
| 891 | } |
| 892 | if e.Right != nil { |
| 893 | workQueue = append(workQueue, e.Right) |
| 894 | } |
| 895 | e.Left = nil |
| 896 | e.Right = nil |
| 897 | e.Operator = "" |
| 898 | binaryExprPool.Put(e) |
| 899 | |
| 900 | case *LiteralValue: |
| 901 | e.Value = nil |
| 902 | e.Type = "" |
| 903 | literalValuePool.Put(e) |
| 904 | |
| 905 | case *FunctionCall: |
| 906 | for i := range e.Arguments { |
| 907 | if e.Arguments[i] != nil { |
| 908 | workQueue = append(workQueue, e.Arguments[i]) |
| 909 | } |
| 910 | e.Arguments[i] = nil |
| 911 | } |
| 912 | e.Arguments = e.Arguments[:0] |
| 913 | e.Name = "" |
| 914 | e.Over = nil |
| 915 | e.Distinct = false |
| 916 | e.Filter = nil |
| 917 | functionCallPool.Put(e) |
| 918 | |
| 919 | case *CaseExpression: |