{"record":{"id":"db1304bfe9a24809","repo":"prestodb/presto","slug":"columns-is-empty","errorCode":null,"errorMessage":"columns is empty","messagePattern":"columns is empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-spi/src/main/java/com/facebook/presto/spi/DiscretePredicates.java","lineNumber":33,"sourceCode":"\nimport com.facebook.presto.common.predicate.TupleDomain;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static java.util.Collections.unmodifiableList;\nimport static java.util.Objects.requireNonNull;\n\npublic final class DiscretePredicates\n{\n    private final List<ColumnHandle> columns;\n    private final Iterable<TupleDomain<ColumnHandle>> predicates;\n\n    public DiscretePredicates(List<ColumnHandle> columns, Iterable<TupleDomain<ColumnHandle>> predicates)\n    {\n        requireNonNull(columns, \"columns is null\");\n        if (columns.isEmpty()) {\n            throw new IllegalArgumentException(\"columns is empty\");\n        }\n        this.columns = unmodifiableList(new ArrayList<>(columns));\n        // do not copy predicates because it may be lazy\n        this.predicates = requireNonNull(predicates, \"predicates is null\");\n    }\n\n    public List<ColumnHandle> getColumns()\n    {\n        return columns;\n    }\n\n    public Iterable<TupleDomain<ColumnHandle>> getPredicates()\n    {\n        return predicates;\n    }\n}\n","sourceCodeStart":15,"sourceCodeEnd":50,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-spi/src/main/java/com/facebook/presto/spi/DiscretePredicates.java#L15-L50","documentation":"DiscretePredicates represents per-split tuple-domain predicates over a set of columns. The constructor requires a non-empty column list because predicates are keyed by columns; an empty column list is rejected with this IllegalArgumentException.","triggerScenarios":"Constructing new DiscretePredicates(Collections.emptyList(), predicates) or passing a column list that ended up empty after filtering.","commonSituations":"Connector metadata code building discrete predicates from dynamically computed column sets that turn out empty; passing predicates with no projected columns when the table has no predicate-relevant columns.","solutions":["Ensure the columns list contains at least one ColumnHandle before constructing","When no columns exist, pass TupleDomain.all() for the split instead of DiscretePredicates","Fix the column-set computation that produced an empty list"],"exampleFix":"// before\nnew DiscretePredicates(ImmutableList.of(), predicates);\n// after\nif (!columns.isEmpty()) {\n    new DiscretePredicates(columns, predicates);\n}","handlingStrategy":"validation","validationCode":"if (columns == null || columns.isEmpty()) { return null; // or use TupleDomain.all() instead of DiscretePredicates }","typeGuard":null,"tryCatchPattern":"try { new DiscretePredicates(columns, predicates); } catch (IllegalArgumentException e) { return null; // degrade to no discrete predicates }","preventionTips":["Build the columns list from non-optional projected handles and assert non-empty","Skip DiscretePredicates entirely when no predicate columns exist","Unit-test connector metadata paths that construct discrete predicates"],"tags":["presto","spi","validation","predicates"],"backgroundTag":"invalid-identifier","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"}