{"record":{"id":"17d30643c556084a","repo":"prestodb/presto","slug":"expression-not-constant","errorCode":"EXPRESSION_NOT_CONSTANT","errorMessage":"Constant expression cannot contain column references","messagePattern":"Constant expression cannot contain column references","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-analyzer/src/main/java/com/facebook/presto/sql/analyzer/ConstantExpressionVerifier.java","lineNumber":54,"sourceCode":"    }\n\n    private static class ConstantExpressionVerifierVisitor\n            extends DefaultTraversalVisitor<Void, Void>\n    {\n        private final Set<NodeRef<Expression>> columnReferences;\n        private final Expression expression;\n\n        public ConstantExpressionVerifierVisitor(Set<NodeRef<Expression>> columnReferences, Expression expression)\n        {\n            this.columnReferences = columnReferences;\n            this.expression = expression;\n        }\n\n        @Override\n        protected Void visitDereferenceExpression(DereferenceExpression node, Void context)\n        {\n            if (columnReferences.contains(NodeRef.<Expression>of(node))) {\n                throw new SemanticException(EXPRESSION_NOT_CONSTANT, expression, \"Constant expression cannot contain column references\");\n            }\n\n            process(node.getBase(), context);\n            return null;\n        }\n\n        @Override\n        protected Void visitIdentifier(Identifier node, Void context)\n        {\n            throw new SemanticException(EXPRESSION_NOT_CONSTANT, expression, \"Constant expression cannot contain column references\");\n        }\n\n        @Override\n        protected Void visitFieldReference(FieldReference node, Void context)\n        {\n            throw new SemanticException(EXPRESSION_NOT_CONSTANT, expression, \"Constant expression cannot contain column references\");\n        }\n","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-analyzer/src/main/java/com/facebook/presto/sql/analyzer/ConstantExpressionVerifier.java#L36-L72","documentation":"ConstantExpressionVerifier validates that expressions used where constants are required (e.g. parameter default values, EXPLAIN options) contain no column references. A DereferenceExpression (e.g. t.col) that itself appears in the expression's column-reference set is rejected with EXPRESSION_NOT_CONSTANT.","triggerScenarios":"Passing a qualified column reference (a.b) as a constant expression — e.g. as a parameter value or generic-limitation-constant context — where the verifier's columnReferences set contains the dereference node.","commonSituations":"Using table-qualified column names in places expecting literals/parameters; generated SQL that substitutes identifiers instead of literals.","solutions":["Replace the column reference with a literal value or parameter placeholder (?)","Wrap the value via a parameter (PREPARE/EXECUTE or session parameter) instead of referencing a column","If row-dependent values are needed, move the expression into the query body rather than a constant context"],"exampleFix":"// before\n-- constant context\nSELECT * FROM t LIMIT :offset_col\n// after\nSELECT * FROM t LIMIT ?  -- bind a literal integer","handlingStrategy":"validation","validationCode":"if (expression instanceof DereferenceExpression && ConstantExpressionVerifier.isColumnReference(expression, metadata)) {\n    throw new IllegalArgumentException(\"Column reference not allowed in constant expression\");\n}","typeGuard":"boolean isLiteralOnly(Expression e) {\n    return e instanceof Literal || e instanceof Parameter;\n}","tryCatchPattern":"try {\n    ConstantExpressionVerifier.verify(identity, expression, metadata, session);\n} catch (SemanticException e) {\n    if (e.getCode() == SemanticErrorCode.EXPRESSION_NOT_CONSTANT) { /* substitute literal or parameter */ }\n    throw e;\n}","preventionTips":["Never place column references (qualified or not) in constant-expression slots","Use '?' parameters or literals where a constant is required","Lint generated SQL for identifiers inside constant contexts"],"tags":["expression","constant","column-reference","semantic-error"],"backgroundTag":"expression-not-constant","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}