{"record":{"id":"51e48027d72757ce","repo":"apache/shardingsphere","slug":"the-sql-clause-s-values-s-is-unsupported-in-e","errorCode":null,"errorMessage":"The SQL clause '%s=VALUES(%s)' is unsupported in encrypt feature.","messagePattern":"The SQL clause '(.+?)=VALUES\\((.+?)\\)' is unsupported in encrypt feature\\.","errorType":"exception","errorClass":"UnsupportedEncryptSQLException","httpStatus":null,"severity":"error","filePath":"features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java","lineNumber":165,"sourceCode":"        ExpressionSegment valueColumnSegment = functionSegment.getParameters().isEmpty() ? null : functionSegment.getParameters().iterator().next();\n        ShardingSpherePreconditions.checkNotNull(valueColumnSegment, () -> new IllegalArgumentException(\"value column segment can not be null\"));\n        String valueColumn = ((ColumnSegment) valueColumnSegment).getIdentifier().getValue();\n        EncryptFunctionAssignmentToken result =\n                new EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), assignmentSegment.getStopIndex(), quoteCharacter);\n        boolean isEncryptColumn = encryptTable.isEncryptColumn(column);\n        boolean isEncryptValueColumn = encryptTable.isEncryptColumn(valueColumn);\n        if (isEncryptColumn && isEncryptValueColumn) {\n            EncryptColumn encryptColumn = encryptTable.getEncryptColumn(column);\n            EncryptColumn encryptValueColumn = encryptTable.getEncryptColumn(valueColumn);\n            String cipherColumn = encryptColumn.getCipher().getName();\n            String cipherValueColumn = encryptValueColumn.getCipher().getName();\n            result.addAssignment(cipherColumn, \"VALUES(\" + cipherValueColumn + \")\");\n            Optional<AssistedQueryColumnItem> assistedQueryColumn = encryptColumn.getAssistedQuery();\n            Optional<AssistedQueryColumnItem> valueAssistedQueryColumn = encryptValueColumn.getAssistedQuery();\n            if (assistedQueryColumn.isPresent() && valueAssistedQueryColumn.isPresent()) {\n                result.addAssignment(assistedQueryColumn.get().getName(), \"VALUES(\" + valueAssistedQueryColumn.get().getName() + \")\");\n            } else if (assistedQueryColumn.isPresent() != valueAssistedQueryColumn.isPresent()) {\n                throw new UnsupportedEncryptSQLException(String.format(\"%s=VALUES(%s)\", column, valueColumn));\n            }\n            Optional<LikeQueryColumnItem> likeQueryColumn = encryptColumn.getLikeQuery();\n            Optional<LikeQueryColumnItem> valueLikeQueryColumn = encryptValueColumn.getLikeQuery();\n            if (likeQueryColumn.isPresent() && valueLikeQueryColumn.isPresent()) {\n                result.addAssignment(likeQueryColumn.get().getName(), \"VALUES(\" + valueLikeQueryColumn.get().getName() + \")\");\n            } else if (likeQueryColumn.isPresent() != valueLikeQueryColumn.isPresent()) {\n                throw new UnsupportedEncryptSQLException(String.format(\"%s=VALUES(%s)\", column, valueColumn));\n            }\n        } else {\n            throw new UnsupportedEncryptSQLException(String.format(\"%s=VALUES(%s)\", column, valueColumn));\n        }\n        ShardingSpherePreconditions.checkState(!result.isAssignmentsEmpty(), () -> new UnsupportedEncryptSQLException(String.format(\"%s=VALUES(%s)\", column, valueColumn)));\n        return result;\n    }\n    \n    private void addCipherAssignment(final String schemaName, final String tableName, final EncryptColumn encryptColumn,\n                                     final ColumnAssignmentSegment assignmentSegment, final EncryptLiteralAssignmentToken token,\n                                     final Object literalValue) {","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/apache/shardingsphere/blob/e952770a215630a3659c75d64369168cd3e26b82/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java#L147-L183","documentation":"EncryptInsertOnUpdateTokenGenerator throws UnsupportedEncryptSQLException('%s=VALUES(%s)') at the first mismatch site: when the INSERT ... ON DUPLICATE KEY UPDATE assignment pairs an encrypted column with a VALUES() reference whose assisted-query presence differs (one has an assisted query column configured, the other does not), so the rewrite cannot generate matching assignments.","triggerScenarios":"An INSERT ... ON DUPLICATE KEY UPDATE col = VALUES(other_col) where both columns are encrypted but only one of them has queryWithAssistedColumn/assisted-query configured in the encrypt rule.","commonSituations":"Adding assisted-query config to one column but not its VALUES() partner; partial rule edits during key migration; column pairs that were symmetric before an assisted column was introduced.","solutions":["Make assisted-query configuration symmetric: either both the target column and the VALUES() source column have assisted query columns, or neither does","If only one column needs assisted query, rewrite the SQL to avoid pairing them in ON DUPLICATE KEY UPDATE","Review the encrypt rule YAML for the named columns after the fix and re-run the insert"],"exampleFix":"# before\ncolumns:\n  col_a: {..., assistedQueryColumn: {name: assisted_a, encryptor: ...}}\n  col_b: {...}  # no assisted query\n# after (align both or neither)\n  col_b: {..., assistedQueryColumn: {name: assisted_b, encryptor: ...}}","handlingStrategy":"validation","validationCode":"void checkValuesPair(EncryptColumn target, EncryptColumn source) { if (target.getAssistedQuery().isPresent() != source.getAssistedQuery().isPresent()) throw new ConfigException(\"assisted-query asymmetry in col=VALUES(col)\"); }","typeGuard":null,"tryCatchPattern":"catch (UnsupportedEncryptSQLException e) { if (e.getMessage().contains(\"=VALUES(\")) { /* align rule config; retry after reload */ } }","preventionTips":["Keep assisted-query config symmetric for columns paired via VALUES()","Review ON DUPLICATE KEY UPDATE statements whenever encrypt rules change"],"tags":["encrypt","on-duplicate-key-update","assisted-query","values-clause"],"backgroundTag":null,"analyzedSha":"e952770a215630a3659c75d64369168cd3e26b82","analyzedAt":"2026-08-14T13:54:53.392Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}