{"record":{"id":"1d5591fdf771e538","repo":"apache/druid","slug":"vectorized-matcher-cannot-make-object-matcher-for","errorCode":null,"errorMessage":"Vectorized matcher cannot make object matcher for ARRAY types","messagePattern":"Vectorized matcher cannot make object matcher for ARRAY types","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/filter/vector/ArrayVectorValueMatcher.java","lineNumber":56,"sourceCode":"      VectorObjectSelector selector\n  )\n  {\n    this.columnType = columnType;\n    this.selector = selector;\n  }\n\n  @Override\n  public VectorValueMatcher makeMatcher(@Nullable String value)\n  {\n    throw new UnsupportedOperationException(\n        \"Vectorized matcher cannot make string matcher for ARRAY types\"\n    );\n  }\n\n  @Override\n  public VectorValueMatcher makeMatcher(Object matchValue, ColumnType matchValueType)\n  {\n    throw new UnsupportedOperationException(\n        \"Vectorized matcher cannot make object matcher for ARRAY types\"\n    );\n  }\n\n  @Override\n  public VectorValueMatcher makeMatcher(DruidPredicateFactory predicateFactory)\n  {\n    final DruidObjectPredicate<Object[]> predicate = predicateFactory.makeArrayPredicate(columnType);\n    return new BaseVectorValueMatcher(selector)\n    {\n      final VectorMatch match = VectorMatch.wrap(new int[selector.getMaxVectorSize()]);\n\n      @Override\n      public ReadableVectorMatch match(final ReadableVectorMatch mask, boolean includeUnknown)\n      {\n        final Object[] vector = selector.getObjectVector();\n        final int[] selection = match.getSelection();\n","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/filter/vector/ArrayVectorValueMatcher.java#L38-L74","documentation":"ArrayVectorValueMatcher cannot build an object-value matcher for ARRAY columns in the vectorized engine; comparing whole array objects against a match value is unsupported, so makeMatcher(Object, ColumnType) unconditionally throws UnsupportedOperationException.","triggerScenarios":"Vectorized selector/in-style filters supplying an object match value (e.g. a List for array comparison) against an ARRAY-typed column.","commonSituations":"Attempts to vectorize array-equality filters; internal engine paths choosing the vector engine for queries filtering ARRAY columns by value.","solutions":["Use a DruidPredicateFactory matcher (makeMatcher(DruidPredicateFactory)) which is supported for array vectors, or filter on unnested columns.","Turn off vectorization for the query (set vectorize=false in the query context) to use the non-vectorized array comparison path.","Express the filter as an array-aware filter (e.g. via SQL ARRAY functions compiled to supported filters)."],"exampleFix":"// before\nvectorMatcher.makeMatcher(arrayValueList, ColumnType.ofArray(...));\n// after\nvectorMatcher.makeMatcher(v -> v != null && v.equals(expectedArray)); // DruidPredicateFactory path, or disable vectorization","handlingStrategy":"validation","validationCode":"if (columnType.isArray() && matchValue != null) { /* route to predicate-based or non-vectorized path */ }","typeGuard":"boolean supportsObjectMatcher = !columnType.isArray();","tryCatchPattern":"try { matcher = arrayMatcher.makeMatcher(matchValue, matchValueType); } catch (UnsupportedOperationException e) { matcher = null; /* fallback path */ }","preventionTips":["Avoid object-value equality filters on ARRAY columns under vectorization","Use predicate-factory matchers for array vectors","Force non-vectorized execution for array-equality queries"],"tags":["druid","vectorization","array","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}