{"record":{"id":"6a29ded3a36d1154","repo":"vitessio/vitess","slug":"vt13001-6a29de","errorCode":"VT13001","errorMessage":"VT13001: [BUG] expected column name","messagePattern":"VT13001: \\[BUG\\] expected column name","errorType":"error_code","errorClass":"VitessError","httpStatus":null,"severity":"error","filePath":"go/vt/vtgate/planbuilder/operators/join.go","lineNumber":168,"sourceCode":"\tpred sqlparser.Expr,\n\tcte *plancontext.ContextCTE,\n) sqlparser.Expr {\n\texpr := breakCTEExpressionInLhsAndRhs(ctx, pred, cte.Id)\n\tpredicate := ctx.PredTracker.NewJoinPredicate(expr.RightExpr)\n\texpr.JoinPredicateID = &predicate.ID\n\texpr.RightExpr = predicate\n\n\tcte.Predicates = append(cte.Predicates, expr)\n\treturn predicate\n}\n\nfunc breakCTEExpressionInLhsAndRhs(ctx *plancontext.PlanningContext, pred sqlparser.Expr, lhsID semantics.TableSet) *plancontext.RecurseExpression {\n\tcol := breakExpressionInLHSandRHS(ctx, pred, lhsID)\n\n\tlhsExprs := slice.Map(col.LHSExprs, func(bve BindVarExpr) plancontext.BindVarExpr {\n\t\tcol, ok := bve.Expr.(*sqlparser.ColName)\n\t\tif !ok {\n\t\t\tpanic(vterrors.VT13001(\"expected column name\"))\n\t\t}\n\t\treturn plancontext.BindVarExpr{\n\t\t\tName: bve.Name,\n\t\t\tExpr: col,\n\t\t}\n\t})\n\treturn &plancontext.RecurseExpression{\n\t\tOriginal:  col.Original,\n\t\tRightExpr: col.RHSExpr,\n\t\tLeftExprs: lhsExprs,\n\t}\n}\n\nfunc createJoin(ctx *plancontext.PlanningContext, LHS, RHS Operator) Operator {\n\tlqg, lok := LHS.(*QueryGraph)\n\trqg, rok := RHS.(*QueryGraph)\n\tif lok && rok {\n\t\top := &QueryGraph{","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtgate/planbuilder/operators/join.go#L150-L186","documentation":"VT13001 is an internal BUG error raised in breakCTEExpressionInLhsAndRhs in go/vt/vtgate/planbuilder/operators/join.go:168 when splitting a predicate between LHS and RHS of a CTE-containing join: a BindVarExpr on the LHS side holds something other than a *sqlparser.ColName. This should be unreachable for valid planner inputs, so it is reported as a [BUG] rather than a user error.","triggerScenarios":"Planner-internal condition: breakExpressionInLHSandRHS returns an LHS expression list containing a non-column expression while splitting a predicate across a CTE boundary in join planning.","commonSituations":"Encountered with unusual CTE + join predicate combinations; typically a planner bug report rather than a user misconfiguration — often seen after upgrading Vitess with queries mixing CTEs and lateral/complex predicates.","solutions":["File a Vitess bug with the full query and vschema (the error is tagged [BUG])","Rewrite the query without the CTE (inline the subquery/derived table) as a workaround","Try simplifying the join predicate to direct column-to-column comparisons","Check whether a newer Vitess version has fixed the planner issue and upgrade"],"exampleFix":"// before (workaround)\nWITH c AS (SELECT id FROM t) SELECT * FROM c JOIN u ON u.id = c.id AND <complex expr>;\n// after\nSELECT * FROM (SELECT id FROM t) AS c JOIN u ON u.id = c.id;","handlingStrategy":"try-catch","validationCode":"// No reliable user-side check: this is a planner-internal invariant failure.\n// Validate the query parses and keep a simplified fallback available.\nconst isCteJoinQuery = /\\bWITH\\b[\\s\\S]*\\bJOIN\\b/i.test(sql);","typeGuard":null,"tryCatchPattern":"try {\n  return await vtgate.execute(sql, args);\n} catch (e) {\n  if (String(e).includes('VT13001')) {\n    reportBug('vitess planner', { query: sql, error: e.message }); // [BUG] — file an issue\n    return await vtgate.execute(rewriteWithoutCte(sql), args); // fallback\n  }\n  throw e;\n}","preventionTips":["Keep CTE join predicates as direct column comparisons","Pin and track Vitess planner fixes; upgrade when [BUG] errors appear","Always report VT13001 occurrences with query and vschema — it signals a planner defect"],"tags":["bug","cte","query-planner"],"backgroundTag":"planner-internal-bug","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}