@@ -185,10 +185,10 @@ func (v *indirectExpandAstVisitor) IsReadOnly() bool {
185185func (v * indirectExpandAstVisitor ) processCTEReference (
186186 node * sqlparser.AliasedTableExpr ,
187187 tableName string ,
188- ) ( bool , error ) {
188+ ) bool {
189189 cteSubquery , isCTE := v .cteRegistry [tableName ]
190190 if ! isCTE {
191- return false , nil
191+ return false
192192 }
193193 // Use the CTE name as the effective alias if no explicit alias is set
194194 effectiveAlias := node .As .GetRawVal ()
@@ -203,13 +203,50 @@ func (v *indirectExpandAstVisitor) processCTEReference(
203203 sq := internaldto .NewSubqueryDTO (syntheticExpr , cteSubquery )
204204 indirect , err := astindirect .NewSubqueryIndirect (sq )
205205 if err != nil {
206- return true , nil //nolint:nilerr //TODO: investigate
206+ return true //nolint:nilerr //TODO: investigate
207207 }
208- err = v .processIndirect (syntheticExpr , indirect )
209- if err != nil {
210- return true , nil //nolint:nilerr //TODO: investigate
208+ _ = v .processIndirect (syntheticExpr , indirect ) //nolint:errcheck // errors handled via indirect pattern
209+ return true
210+ }
211+
212+ // visitAliasedTableExpr handles visiting an AliasedTableExpr node, including
213+ // subqueries, CTE references, and regular table expressions.
214+ func (v * indirectExpandAstVisitor ) visitAliasedTableExpr (node * sqlparser.AliasedTableExpr ) error {
215+ if node .Expr != nil {
216+ switch n := node .Expr .(type ) { //nolint:gocritic // switch preferred for type assertions
217+ case * sqlparser.Subquery :
218+ sq := internaldto .NewSubqueryDTO (node , n )
219+ indirect , err := astindirect .NewSubqueryIndirect (sq )
220+ if err != nil {
221+ return nil //nolint:nilerr //TODO: investigate
222+ }
223+ _ = v .processIndirect (node , indirect ) //nolint:errcheck // errors handled via indirect pattern
224+ return nil
225+ case sqlparser.TableName :
226+ if v .processCTEReference (node , n .GetRawVal ()) {
227+ return nil
228+ }
229+ }
230+ if err := node .Expr .Accept (v ); err != nil {
231+ return err
232+ }
211233 }
212- return true , nil
234+ if node .Partitions != nil {
235+ if err := node .Partitions .Accept (v ); err != nil {
236+ return err
237+ }
238+ }
239+ if ! node .As .IsEmpty () {
240+ if err := node .As .Accept (v ); err != nil {
241+ return err
242+ }
243+ }
244+ if node .Hints != nil {
245+ if err := node .Hints .Accept (v ); err != nil {
246+ return err
247+ }
248+ }
249+ return nil
213250}
214251
215252func (v * indirectExpandAstVisitor ) ContainsAnalyticsCacheMaterial () bool {
@@ -813,52 +850,8 @@ func (v *indirectExpandAstVisitor) Visit(node sqlparser.SQLNode) error {
813850 }
814851
815852 case * sqlparser.AliasedTableExpr :
816- if node .Expr != nil {
817- //nolint:gocritic // deferring cosmetics on visitors
818- switch n := node .Expr .(type ) {
819- case * sqlparser.Subquery :
820- sq := internaldto .NewSubqueryDTO (node , n )
821- indirect , err := astindirect .NewSubqueryIndirect (sq )
822- if err != nil {
823- return nil //nolint:nilerr //TODO: investigate
824- }
825- err = v .processIndirect (node , indirect )
826- if err != nil {
827- return nil //nolint:nilerr //TODO: investigate
828- }
829- return nil
830- case sqlparser.TableName :
831- // Check if this table name is a CTE reference
832- processed , err := v .processCTEReference (node , n .GetRawVal ())
833- if err != nil {
834- return err
835- }
836- if processed {
837- return nil
838- }
839- }
840- err := node .Expr .Accept (v )
841- if err != nil {
842- return err
843- }
844- }
845- if node .Partitions != nil {
846- err := node .Partitions .Accept (v )
847- if err != nil {
848- return err
849- }
850- }
851- if ! node .As .IsEmpty () {
852- err := node .As .Accept (v )
853- if err != nil {
854- return err
855- }
856- }
857- if node .Hints != nil {
858- err := node .Hints .Accept (v )
859- if err != nil {
860- return err
861- }
853+ if err := v .visitAliasedTableExpr (node ); err != nil {
854+ return err
862855 }
863856
864857 case sqlparser.TableNames :
0 commit comments