{"record":{"id":"265f16b48c57f0cf","repo":"prestodb/presto","slug":"not-supported-265f16","errorCode":"NOT_SUPPORTED","errorMessage":"Only column specifications connected by logical AND are supported in WHERE clause.","messagePattern":"Only column specifications connected by logical AND are supported in WHERE clause\\.","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/RefreshMaterializedViewPredicateAnalyzer.java","lineNumber":109,"sourceCode":"        public Map<SchemaTableName, Expression> getTablePredicates()\n        {\n            ImmutableMap.Builder<SchemaTableName, Expression> tableConjuncts = ImmutableMap.builder();\n\n            tablePredicatesBuilder.build().asMap().forEach((table, predicateCollection) -> {\n                Optional<Expression> conjunctOptional = predicateCollection.stream()\n                        .reduce((left, right) -> new LogicalBinaryExpression(LogicalBinaryExpression.Operator.AND, left, right));\n\n                conjunctOptional.ifPresent(conjunct -> tableConjuncts.put(table, conjunct));\n            });\n\n            return tableConjuncts.build();\n        }\n\n        @Override\n        public Void process(Node node, @Nullable Void context)\n        {\n            if (!(node instanceof ComparisonExpression || node instanceof LogicalBinaryExpression || node instanceof InPredicate)) {\n                throw new SemanticException(NOT_SUPPORTED, node, \"Only column specifications connected by logical AND are supported in WHERE clause.\");\n            }\n\n            return super.process(node, null);\n        }\n\n        @Override\n        protected Void visitExpression(Expression node, Void context)\n        {\n            throw new SemanticException(NOT_SUPPORTED, node, \"Only column specifications connected by logical AND are supported in WHERE clause.\");\n        }\n\n        @Override\n        protected Void visitLogicalBinaryExpression(LogicalBinaryExpression node, Void context)\n        {\n            if (LogicalBinaryExpression.Operator.OR.equals(node.getOperator())) {\n                SchemaTableName viewName = new SchemaTableName(viewDefinition.getSchema(), viewDefinition.getTable());\n                tablePredicatesBuilder.put(viewName, node);\n                return null;","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/RefreshMaterializedViewPredicateAnalyzer.java#L91-L127","documentation":"RefreshMaterializedViewPredicateAnalyzer.process validates that every node in a materialized view's refresh WHERE clause is a ComparisonExpression, LogicalBinaryExpression, or InPredicate. Any other expression shape (function calls, NOT, complex subqueries, arithmetic predicates, etc.) triggers NOT_SUPPORTED because only simple AND-connected column predicates can be used for incremental refresh partition pruning.","triggerScenarios":"Creating a materialized view whose WHERE clause contains unsupported constructs, e.g. NOT (...), OR with non-comparison branches, function-call predicates, or quantified/complex comparisons.","commonSituations":"Incremental materialized view refresh configuration with expressive filters that exceed the simple AND-of-comparisons subset the predicate analyzer supports.","solutions":["Rewrite the WHERE clause as conjunctions (AND) of simple comparison or IN predicates","Remove NOT/complex expressions or rewrite them (e.g. a > 10 AND a < 20 instead of BETWEEN, invert NOT comparisons)","Disable incremental refresh or use a full refresh if the complex predicate is required"],"exampleFix":"// before\nCREATE MATERIALIZED VIEW mv AS SELECT * FROM t WHERE NOT (a = 1);\n// after\nCREATE MATERIALIZED VIEW mv AS SELECT * FROM t WHERE a != 1;","handlingStrategy":"validation","validationCode":"// Ensure the MV WHERE clause is only AND-connected comparisons/IN predicates before creating the view\nfor (Expression conjunct : extractConjuncts(whereClause)) {\n    if (!(conjunct instanceof ComparisonExpression) && !(conjunct instanceof InPredicate)) {\n        throw new IllegalArgumentException(\"Unsupported predicate in MV WHERE clause: \" + conjunct);\n    }\n}","typeGuard":"boolean isSupportedPredicate(Expression e) { return e instanceof ComparisonExpression || e instanceof LogicalBinaryExpression || e instanceof InPredicate; }","tryCatchPattern":"try { createMaterializedView(...); } catch (SemanticException e) { if (e.getCode() == NOT_SUPPORTED && e.getMessage().contains(\"WHERE clause\")) { /* rewrite predicate or disable incremental refresh */ } else { throw e; } }","preventionTips":["Write MV WHERE clauses as ANDs of simple comparisons or IN lists","Avoid NOT, OR over complex branches, and function-call predicates in refresh filters","Prefer BETWEEN rewritten as two comparisons (a > x AND a < y)"],"tags":["presto","sql","materialized-view","not-supported","where-clause"],"backgroundTag":"unsupported-predicate-in-where-clause","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"}