{"record":{"id":"764927fe2499fbd4","repo":"spring-projects/spring-ai","slug":"failed-to-delete-documents-by-filter-764927","errorCode":null,"errorMessage":"Failed to delete documents by filter","messagePattern":"Failed to delete documents by filter","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java","lineNumber":352,"sourceCode":"\t\t\t@Override\n\t\t\tpublic int getBatchSize() {\n\t\t\t\treturn idList.size();\n\t\t\t}\n\t\t});\n\t}\n\n\t@Override\n\tprotected void doDelete(Filter.Expression filterExpression) {\n\t\tString filterClause = this.filterExpressionConverter.convertExpression(filterExpression);\n\n\t\tString sql = \"DELETE FROM \" + getFullyQualifiedTableName() + \" WHERE \" + filterClause;\n\n\t\t// Execute the delete\n\t\ttry {\n\t\t\tthis.jdbcTemplate.update(sql);\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\tthrow new IllegalStateException(\"Failed to delete documents by filter\", e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<Document> doSimilaritySearch(SearchRequest request) {\n\n\t\tString nativeFilterExpression = (request.getFilterExpression() != null)\n\t\t\t\t? this.filterExpressionConverter.convertExpression(request.getFilterExpression()) : \"\";\n\n\t\tString jsonPathFilter = \"\";\n\n\t\tif (StringUtils.hasText(nativeFilterExpression)) {\n\t\t\tjsonPathFilter = \" AND \" + nativeFilterExpression + \" \";\n\t\t}\n\n\t\tdouble distance = 1 - request.getSimilarityThreshold();\n\n\t\tPGvector queryEmbedding = getQueryEmbedding(request.getQuery());","sourceCodeStart":334,"sourceCodeEnd":370,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java#L334-L370","documentation":"PgVectorStore.doDelete wraps the JDBC delete execution for filter-based deletion; any exception thrown by jdbcTemplate.update (SQL syntax error from the generated filter SQL, connection problems, constraint violations) is rethrown as IllegalStateException(\"Failed to delete documents by filter\", e) with the root cause attached.","triggerScenarios":"Calling vectorStore.delete(Filter.expressionValue(\"...\")) where the generated SQL fails — invalid filter expression conversion, nonexistent column in the filter, or a database connectivity/lock issue during the UPDATE/DELETE.","commonSituations":"Filtering on metadata keys that map to no SQL column; SQL injection-safe but syntactically broken expressions; transient connection drops; table locked by a migration.","solutions":["Inspect the wrapped cause (e.getCause()) for the actual PostgreSQL error.","Verify the filter expression references valid columns and uses supported operators.","Check database connectivity and lock state at delete time.","Retry the delete if the cause is transient (connection reset)."],"exampleFix":"// before\nvectorStore.delete(Filter.expressionValue(\"meta.author == 'unknown'\")); // unknown column\n// after\nvectorStore.delete(Filter.expressionValue(\"author == 'unknown'\")); // valid mapped key","handlingStrategy":"try-catch","validationCode":"Objects.requireNonNull(filter, \"filter must not be null for filter-based delete\");","typeGuard":null,"tryCatchPattern":"try {\n    vectorStore.delete(Filter.expressionValue(expr));\n} catch (IllegalStateException e) {\n    logger.error(\"Filter delete failed: {}\", e.getCause() != null ? e.getCause().getMessage() : e.getMessage());\n    if (isTransient(e.getCause())) retryBackoff();\n}","preventionTips":["Always inspect e.getCause() — the real JDBC/SQL error is there.","Test filter expressions against a dev database before production deletes.","Restrict filter keys to mapped columns.","Wrap deletes in transactions where possible."],"tags":["pgvector","delete","database"],"backgroundTag":"database-query-failed","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}