{"record":{"id":"be71b780bdf58e0c","repo":"apache/cassandra","slug":"prepared-statement-of-size-d-bytes-is-larger-than","errorCode":null,"errorMessage":"Prepared statement of size %d bytes is larger than allowed maximum of %d MB: %s...","messagePattern":"Prepared statement of size (.+?) bytes is larger than allowed maximum of (.+?) MB: (.+?)\\.\\.\\.","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/QueryProcessor.java","lineNumber":883,"sourceCode":"    @VisibleForTesting\n    private static ResultMessage.Prepared createResultMessage(MD5Digest statementId, Prepared existing)\n    throws InvalidRequestException\n    {\n        ResultSet.PreparedMetadata preparedMetadata = ResultSet.PreparedMetadata.fromPrepared(existing.statement);\n        ResultSet.ResultMetadata resultMetadata = ResultSet.ResultMetadata.fromPrepared(existing.statement);\n        return new ResultMessage.Prepared(statementId, resultMetadata.getResultMetadataId(), preparedMetadata, resultMetadata);\n    }\n\n    @VisibleForTesting\n    public static ResultMessage.Prepared storePreparedStatement(String queryString, String keyspace, Prepared prepared)\n    throws InvalidRequestException\n    {\n        // Concatenate the current keyspace so we don't mix prepared statements between keyspace (#5352).\n        // (if the keyspace is null, queryString has to have a fully-qualified keyspace so it's fine.\n        MD5Digest statementId = computeId(queryString, keyspace);\n        // don't execute the statement if it's bigger than the allowed threshold\n        if (getSizeOfPreparedStatementForCache(statementId, prepared) > capacityToBytes(DatabaseDescriptor.getPreparedStatementsCacheSizeMiB()))\n            throw new InvalidRequestException(String.format(\"Prepared statement of size %d bytes is larger than allowed maximum of %d MB: %s...\",\n                                                            prepared.pstmntSize,\n                                                            DatabaseDescriptor.getPreparedStatementsCacheSizeMiB(),\n                                                            queryString.substring(0, 200)));\n\n        Prepared previous = preparedStatements.get(statementId, (ignored_) -> prepared);\n        if (previous == prepared)\n            SystemKeyspace.writePreparedStatement(keyspace, statementId, queryString, prepared.timestamp);\n\n        ResultSet.PreparedMetadata preparedMetadata = ResultSet.PreparedMetadata.fromPrepared(prepared.statement);\n        ResultSet.ResultMetadata resultMetadata = ResultSet.ResultMetadata.fromPrepared(prepared.statement);\n        return new ResultMessage.Prepared(statementId, resultMetadata.getResultMetadataId(), preparedMetadata, resultMetadata);\n    }\n\n    @Override\n    public ResultMessage processPrepared(CQLStatement statement,\n                                         QueryState state,\n                                         QueryOptions options,\n                                         Map<String, ByteBuffer> customPayload,","sourceCodeStart":865,"sourceCodeEnd":901,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/QueryProcessor.java#L865-L901","documentation":"When storing a prepared statement in the in-JVM prepared statements cache, Cassandra measures its serialized size and rejects statements larger than the configured cache size (cassandra.yaml prepared_statements_cache_size_mb). The statement is not cached and the client receives an InvalidRequestException with the statement's first 200 characters.","triggerScenarios":"Preparing a CQL statement whose in-memory representation exceeds DatabaseDescriptor.getPreparedStatementsCacheSizeMiB() converted to bytes; common with huge IN clauses, thousands of markers, or when the cache size is set very small (or explicitly to 0/tiny value in tests).","commonSituations":"prepared_statements_cache_size_mb set to a small value in cassandra.yaml; schema with thousands of columns; dynamically generated queries with enormous IN lists; containers with tight heap where the cache was shrunk.","solutions":["Increase prepared_statements_cache_size_mb in cassandra.yaml and restart","Shorten the query: reduce IN-list size or number of bind markers","Split the oversized statement into several smaller statements","Ensure the cache size is not misconfigured (e.g. left at 0) in the environment"],"exampleFix":"// cassandra.yaml\n// before\nprepared_statements_cache_size_mb: 1\n// after\nprepared_statements_cache_size_mb: 16","handlingStrategy":"validation","validationCode":"long maxBytes = DatabaseDescriptor.getPreparedStatementsCacheSizeMiB() * 1024L * 1024L;\nif (queryString.length() > maxBytes / 16) log.warn(\"Statement may exceed prepared-statement cache budget: \" + queryString.substring(0, 200));","typeGuard":null,"tryCatchPattern":"try { session.prepare(bigQuery); } catch (InvalidRequestException e) { if (e.getMessage().startsWith(\"Prepared statement of size\")) return splitStatement(bigQuery); throw e; }","preventionTips":["Keep prepared_statements_cache_size_mb at a sane value (>= a few MiB)","Cap IN-clause sizes and bind marker counts","Split huge batched queries into per-row statements"],"tags":["cql","prepared-statement","cache","size-limit"],"backgroundTag":"payload-too-large","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}