apache/shardingsphere · error · UnsupportedSQLOperationException

1

1

Error message

Unsupported SQL operation: CREATE TEMPORARY TABLE.

What it means

Error "Unsupported SQL operation: CREATE TEMPORARY TABLE." thrown in apache/shardingsphere.

Source

Thrown at infra/context/src/main/java/org/apache/shardingsphere/infra/connection/kernel/KernelProcessor.java:74

        SQLRewriteResult rewriteResult = rewrite(queryContext, globalRuleMetaData, props, routeContext);
        ExecutionContext result = createExecutionContext(queryContext, routeContext, rewriteResult);
        logSQL(queryContext, props, result);
        return result;
    }
    
    private void check(final QueryContext queryContext) {
        checkUnsupportedTemporaryTableDDL(queryContext);
        if (queryContext.getHintValueContext().isSkipMetadataValidate()) {
            return;
        }
        ShardingSphereDatabase database = queryContext.getUsedDatabase();
        new SupportedSQLCheckEngine().checkSQL(database.getRuleMetaData().getRules(), queryContext.getSqlStatementContext(), database);
    }
    
    private void checkUnsupportedTemporaryTableDDL(final QueryContext queryContext) {
        SQLStatement sqlStatement = queryContext.getSqlStatementContext().getSqlStatement();
        if (sqlStatement instanceof CreateTableStatement && ((CreateTableStatement) sqlStatement).isTemporary()) {
            throw new UnsupportedSQLOperationException("CREATE TEMPORARY TABLE");
        }
        if (sqlStatement instanceof DropTableStatement && ((DropTableStatement) sqlStatement).isTemporary()) {
            throw new UnsupportedSQLOperationException("DROP TEMPORARY TABLE");
        }
    }
    
    private RouteContext route(final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ConfigurationProperties props) {
        ShardingSphereDatabase database = queryContext.getUsedDatabase();
        return new SQLRouteEngine(database.getRuleMetaData().getRules(), props).route(queryContext, globalRuleMetaData, database);
    }
    
    private SQLRewriteResult rewrite(final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ConfigurationProperties props, final RouteContext routeContext) {
        SQLRewriteEntry sqlRewriteEntry = new SQLRewriteEntry(queryContext.getUsedDatabase(), globalRuleMetaData, props);
        return sqlRewriteEntry.rewrite(queryContext, routeContext);
    }
    
    private ExecutionContext createExecutionContext(final QueryContext queryContext, final RouteContext routeContext, final SQLRewriteResult rewriteResult) {
        return new ExecutionContext(queryContext, ExecutionContextBuilder.build(queryContext.getUsedDatabase(), rewriteResult, queryContext.getSqlStatementContext()), routeContext);

View on GitHub (pinned to e952770a21)

Solutions

  1. Create a regular (non-temporary) table instead.
  2. Remove the TEMPORARY keyword and let the table be routed as a normal sharding or single table.
  3. Perform the temporary table operation directly on the target database outside ShardingSphere.

When it happens

Trigger: A CREATE TEMPORARY TABLE statement is submitted through the ShardingSphere kernel processor, which does not support temporary tables.

Common situations: Applications or ORM tools issuing CREATE TEMPORARY TABLE for intermediate results through ShardingSphere-Proxy or JDBC.


AI-assisted analysis of apache/shardingsphere@e952770a21 (2026-08-14). Data as JSON: /api/errors/9ccafde79cfe0b89. Report an issue: GitHub.