10.10.5. 多发比对对外推送报告接口

10.10.5.1. 简介

多发比对提供了对外推送报告接口,用户可以通过在比对服务内配置http推送地址,比对服务在报告生成后会通过post方式将比对报告推送到用户指定的地址上,用户可以根据报告内容进行自定义处理。

10.10.5.2. 比对服务对外推送地址配置

可以通过比对服务配置项 comparison.compareResultPushUrl 来配置对外推送地址,具体可参考 比对服务通用配置

10.10.5.3. 请求方式

POST

10.10.5.4. Content-Type

application/json;charset=UTF-8

10.10.5.5. 接口推送请求体格式(json)

{
    "traceId": "c2ce6908-e1b1-429d-b557-49b82cea5b9e",
    "bizSql": "update XXXX0",
    "state": "success",
    "sqlType": "INSERT",
    "sourceDatabase": "ORACLE",
    "targetDatabases": [
        "DM",
        "GAUSSDB_ORACLE",
        "LIGHTDB_ORACLE",
        "OCEAN_BASE_ORACLE"
    ],
    "transformSqls": [
        "update XXXX1",
        "update XXXX2",
        "update XXXX3",
        "update XXXX4"
    ],
    "beforeSqls": [
        "select XXXX1",
        "select XXXX2",
        "select XXXX3",
        "select XXXX4"
    ],
    "afterSqls": [
        "select XXXX1",
        "select XXXX2",
        "select XXXX3",
        "select XXXX4"
    ],
    "appName": "hsbroker.fob",
    "functionId": "fob.putNoticebkMod",
    "sqlSequence": 1,
    "sqlExecutionTime": "2025-02-21 14:22:28",
    "beforeDiff": {
        "columns": [
            "EMP_ID",
            "EMP_NAME",
            "NEW_SALARY"
        ],
        "rules": [
            "NA",
            "NA",
            "NA"
        ],
        "data": [
            [{
                    "s": "Edward",
                    "t0": "Edward",
                    "t1": "Edward",
                    "t2": "Edwarda",
                    "t3": "Edward",
                    "diff": 0
                },
                {
                    "s": "Edward1",
                    "t0": "Edward0",
                    "t1": "Edward1",
                    "t2": "Edwarda1",
                    "t3": "Edward",
                    "diff": 0
                }
            ]
        ]
    },
    "afterDiff": {
        "columns": [
            "EMP_ID",
            "EMP_NAME",
            "NEW_SALARY"
        ],
        "rules": [
            "NA",
            "NA",
            "NA"
        ],
        "data": [
            [{
                    "s": "Edward",
                    "t0": "Edward",
                    "t1": "Edward",
                    "t2": "Edwarda",
                    "t3": "Edward",
                    "diff": 0
                },
                {
                    "s": "Edward1",
                    "t0": "Edward0",
                    "t1": "Edward1",
                    "t2": "Edwarda1",
                    "t3": "Edward",
                    "diff": 0
                }
            ]
        ]
    },
    "tableName": "dual",
    "message": {
        "GAUSSDB_ORACLE": "目标库执行异常的错误提示消息",
        "DM": "达梦执行异常的错误消息,查询结果集可能为空"
    }
}

10.10.5.5.1. 请求体字段说明

  1. traceId:链路ID,由系统自动生成的UUID值或由外部传入

  2. bizSql:业务SQL,参与多发比对的源库SQL语句

  3. state:比对结果,取值范围为:

取值

说明

SUCCESS

多发比对成功

UNISQL_PARSE_FAIL

多发比对过程中统一sql转换失败

DML2DQL_PARSE_FAIL

多发比对过程中增、删、改SQL转查询语句失败

BIZ_SQL_EXECUTE_FAIL

多发比对过程中业务SQL执行失败

MULTI_QUERY_FAI

多发比对过程中结果集查询失败

COMPARE_FAIL

多发比对过程中数据比对失败

  1. sqlType:SQL类型,取值范围为:INSERT/UPDATE/DELETE/SELECT/REPLACE/MERGE等,根据支持情况会按需扩充

  2. sourceDatabase:源数据库,参考 数据库支持范围

  3. targetDatabases:目标数据库列表,参考 数据库支持范围

  4. transformSqls:转换后信创库SQL集合,真多发场景下,由统一SQL转换而来;伪多发场景下,由业务手写而来

  5. beforeSqls:每个目标库的前查询SQL集合,用于查询dml操作之前满足条件的数据;如果是查询语句的多发比对,则是业务SQL转换后的SQL。

  6. afterSqls:每个目标库的后查询SQL集合,用于查询dml操作之后满足条件的数据

  7. appName:应用名称

  8. functionId:功能号

  9. sqlSequence:SQL执行顺序,从1开始,表示业务SQL在同一个链路下的执行顺序

  10. sqlExecutionTime:业务SQL执行时间

  11. beforeDiff/afterDiff:前查询比对结果,如果本身是查询语句,也使用该字段

    14.1 columns:查询结果集列名称

    14.2 rules:比对时应用的比对规则信息

    14.3 data:单个列的比对信息

    14.3.1 s:源数据库列值

    14.3.2 tX:某个目标库的列值,X从0,开始,对应targetDatabases中目标库的列值

    14.3.3 diff:当前列整体是否和源库有差异,1有差异,0比对成功

    14.3.4 tXdiff:某个目标库的列值是否和源库有差异,1有差异,0比对成功

  12. tableName:业务SQL涉及的表

  13. message:比对执行过程中的错误消息,key是数据库名称,参考 数据库支持范围 ,value是错误消息,多个库存在报错时,会有多个key出现。

约束关系:

  1. targetDatabases 和 data 有关联,t0 表示 targetDatabases[0] 目标库的数据,t0diff表示该目标库制定列的比对结果,1为失败,0为成功

  2. 如果是查询SQL,则比对结果存储在beforeDiff,即afterDiff是空的

  3. 目标库执行报错情况下,beforeDiff/afterDiff 内部可能为空,且 message 中有对应的报错信息

  4. tXdiff 规划中,先预留字段

10.10.5.5.2. 接口返回值建议格式

{
"code": 0,
"message": "错误消息"
}

字段说明:

  1. code:状态码,0表示成功,非0表示失败

  2. message:错误消息,code=0时,返回success,非0时,返回具体的报错消息

10.10.5.6. 推送示例

10.10.5.6.1. 包含前后比对结果的报告示例

{
    "afterDiff": {
        "columns": ["id", "name"],
        "data": [
            [{
                "diff": 0,
                "s": 1,
                "t0": 1
            }, {
                "diff": 0,
                "s": 1,
                "t0": 1
            }],
            [{
                "diff": 1,
                "s": 1
            }, {
                "diff": 1,
                "s": 1
            }]
        ],
        "rules": ["NA", "NA"]
    },
    "afterSqls": ["SELECT * FROM \"junit_test_insert_03_20_5\" WHERE \"id\"=1 AND \"name\"=1 ORDER BY \"id\""],
    "appName": "appName",
    "beforeDiff": {
        "columns": ["id", "name"],
        "data": [
            [{
                "diff": 0,
                "s": 1,
                "t0": 1
            }, {
                "diff": 0,
                "s": 1,
                "t0": 1
            }],
            [{
                "diff": 1,
                "s": 1
            }, {
                "diff": 1,
                "s": 1
            }]
        ],
        "rules": ["NA", "NA"]
    },
    "beforeSqls": ["SELECT * FROM \"junit_test_insert_03_20_5\" WHERE \"id\"=1 AND \"name\"=1 ORDER BY \"id\""],
    "bizSql": "insert into `junit_test_insert_03_20_5` (`id`,name) values (1,1)",
    "sourceDatabase": "MYSQL",
    "sqlExecutionTime": "2025-03-26 14:27:15",
    "sqlSequence": 1,
    "sqlType": "INSERT",
    "state": "COMPARE_FAIL",
    "tableName": "junit_test_insert_03_20_5",
    "targetDatabases": ["LIGHTDB_MYSQL"],
    "traceId": "7e3c3f9a71374710b9f124ff869ce9d8",
    "transformSqls": ["INSERT INTO \"junit_test_insert_03_20_5\" (\"id\",\"name\") VALUES (1,1)"]
}

10.10.5.6.2. 包含错误信息的比对报告示例

{
    "afterDiff": {
        "columns": ["char_column", "varchar2_column", "number_column", "integer_column", "date_column", "varchar_column", "timestamp_column", "decimal_column"],
        "data": [
            [{
                "diff": 0,
                "s": "char_data ",
                "t0": "char_data ",
                "t1": "char_data "
            }, {
                "diff": 0,
                "s": "varchar2_data",
                "t0": "varchar2_data",
                "t1": "varchar2_data"
            }, {
                "diff": 0,
                "s": 12345,
                "t0": 12345,
                "t1": 12345
            }, {
                "diff": 0,
                "s": 123,
                "t0": 123,
                "t1": 123
            }, {
                "diff": 0,
                "s": "2023-01-01 00:00:00",
                "t0": "2023-01-01 00:00:00",
                "t1": "2023-01-01 00:00:00"
            }, {
                "diff": 0,
                "s": "varchar_data",
                "t0": "varchar_data",
                "t1": "varchar_data"
            }, {
                "diff": 0,
                "s": "2023-01-01 12:00:00",
                "t0": "2023-01-01 12:00:00",
                "t1": "2023-01-01 12:00:00.000000"
            }, {
                "diff": 0,
                "s": 12345.67,
                "t0": 12345.67,
                "t1": 12345.67
            }]
        ],
        "message": {
            "LIGHTDB_ORACLE": "业务SQL执行失败,业务SQL:INSERT INTO multi_tenant_test_2 (\n  char_column,\n  varchar2_column,\n  number_column,\n  integer_column,\n  date_column,\n  varchar_column,\n  timestamp_column,\n  decimal_column\n) VALUES (\n  'char_data ',                                \n  'varchar2_data',                             \n  12345,                                       \n  123,                                         \n  TO_DATE('2023-01-01', 'YYYY-MM-DD'),         \n  'varchar_data',                              \n  TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'),                                \n  12345.67\n) 异常信息:org.postgresql.util.PSQLException: ERROR: relation \"multi_tenant_test_2\" does not exist\n  Position: 13\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.ALLATORIxDEMO(uh:1951)\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.processResults(uh:3078)\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.execute(uh:294)\r\n\tat org.postgresql.jdbc.PgStatement.ALLATORIxDEMO(km:571)\r\n\tat org.postgresql.jdbc.PgStatement.execute(km:261)\r\n\tat org.postgresql.jdbc.PgStatement.executeWithFlags(km:411)\r\n\tat org.postgresql.jdbc.PgStatement.ALLATORIxDEMO(km:309)\r\n\tat org.postgresql.jdbc.PgStatement.executeWithFlags(km:280)\r\n\tat org.postgresql.jdbc.PgStatement.execute(km:352)\r\n\tat com.hundsun.lightdb.unisql.model.MultiplexContext.execute(MultiplexContext.java:597)\r\n\tat com.hundsun.lightdb.unisql.proxy.jdbc.UnisqlStatement.execute(UnisqlStatement.java:83)\r\n\tat com.hundsun.lightdb.unisql.model.MultiplexContext.executeMultiplex(MultiplexContext.java:653)\r\n\tat com.hundsun.lightdb.unisql.proxy.multijdbc.MultiStatement.execute(MultiStatement.java:284)\r\n\tat com.hundsun.lightdb.unisql.proxy.multijdbc.MultiStatement.executeUpdate(MultiStatement.java:80)\r\n\tat com.hundsun.lightdb.unisql.golang.MultiplexTest.multiplexPrepared(MultiplexTest.java:84)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)\r\n\tat org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1541)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1541)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)\r\n\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)\r\n\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)\r\n\tat com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)\r\n\tat com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)\r\n\tat com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)\r\n\tat com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)\r\n"
        },
        "rules": ["NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"]
    },
    "afterSqls": ["SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column", "SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column", "SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column"],
    "appName": "appName",
    "beforeDiff": {
        "columns": ["char_column", "varchar2_column", "number_column", "integer_column", "date_column", "varchar_column", "timestamp_column", "decimal_column"],
        "data": [
            [{
                "diff": 0,
                "s": "char_data ",
                "t0": "char_data ",
                "t1": "char_data "
            }, {
                "diff": 0,
                "s": "varchar2_data",
                "t0": "varchar2_data",
                "t1": "varchar2_data"
            }, {
                "diff": 0,
                "s": 12345,
                "t0": 12345,
                "t1": 12345
            }, {
                "diff": 0,
                "s": 123,
                "t0": 123,
                "t1": 123
            }, {
                "diff": 0,
                "s": "2023-01-01 00:00:00",
                "t0": "2023-01-01 00:00:00",
                "t1": "2023-01-01 00:00:00"
            }, {
                "diff": 0,
                "s": "varchar_data",
                "t0": "varchar_data",
                "t1": "varchar_data"
            }, {
                "diff": 1,
                "s": "2023-01-01 12:00:00",
                "t0": "2023-01-01 12:00:00",
                "t1": "2023-01-01 12:00:00.000000"
            }, {
                "diff": 0,
                "s": 12345.67,
                "t0": 12345.67,
                "t1": 12345.67
            }]
        ],
        "message": {
            "LIGHTDB_ORACLE": "多发查询失败,多发查询SQL SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column 错误消息org.postgresql.util.PSQLException: ERROR: relation \"multi_tenant_test_2\" does not exist\n  Position: 15\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.ALLATORIxDEMO(uh:1951)\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.processResults(uh:3078)\r\n\tat org.postgresql.core.v3.QueryExecutorImpl.execute(uh:294)\r\n\tat org.postgresql.jdbc.PgStatement.ALLATORIxDEMO(km:571)\r\n\tat org.postgresql.jdbc.PgStatement.execute(km:261)\r\n\tat org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(bh:85)\r\n\tat org.postgresql.jdbc.PgPreparedStatement.executeQuery(bh:190)\r\n\tat com.hundsun.lightdb.unisql.utils.MultiJdbcUtils.doPreparedQuery(MultiJdbcUtils.java:139)\r\n\tat com.hundsun.lightdb.unisql.utils.MultiJdbcUtils.doPreparedQuery(MultiJdbcUtils.java:47)\r\n\tat com.hundsun.lightdb.unisql.model.MultiplexContext.doMultiBeforeQuery(MultiplexContext.java:872)\r\n\tat com.hundsun.lightdb.unisql.model.MultiplexContext.execute(MultiplexContext.java:589)\r\n\tat com.hundsun.lightdb.unisql.proxy.jdbc.UnisqlStatement.execute(UnisqlStatement.java:83)\r\n\tat com.hundsun.lightdb.unisql.model.MultiplexContext.executeMultiplex(MultiplexContext.java:653)\r\n\tat com.hundsun.lightdb.unisql.proxy.multijdbc.MultiStatement.execute(MultiStatement.java:284)\r\n\tat com.hundsun.lightdb.unisql.proxy.multijdbc.MultiStatement.executeUpdate(MultiStatement.java:80)\r\n\tat com.hundsun.lightdb.unisql.golang.MultiplexTest.multiplexPrepared(MultiplexTest.java:84)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)\r\n\tat org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)\r\n\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)\r\n\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)\r\n\tat org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)\r\n\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1541)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1541)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)\r\n\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)\r\n\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)\r\n\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)\r\n\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)\r\n\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)\r\n\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)\r\n\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)\r\n\tat com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)\r\n\tat com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)\r\n\tat com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)\r\n\tat com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)\r\n"
        },
        "rules": ["NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"]
    },
    "beforeSqls": ["SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column", "SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column", "SELECT * FROM multi_tenant_test_2 WHERE char_column='char_data ' AND varchar2_column='varchar2_data' AND number_column=12345 AND integer_column=123 AND date_column=TO_DATE('2023-01-01', 'YYYY-MM-DD') AND varchar_column='varchar_data' AND timestamp_column=TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') AND decimal_column=12345.67 ORDER BY char_column"],
    "bizSql": "INSERT INTO multi_tenant_test_2 (\n  char_column,\n  varchar2_column,\n  number_column,\n  integer_column,\n  date_column,\n  varchar_column,\n  timestamp_column,\n  decimal_column\n) VALUES (\n  'char_data ',                                \n  'varchar2_data',                             \n  12345,                                       \n  123,                                         \n  TO_DATE('2023-01-01', 'YYYY-MM-DD'),         \n  'varchar_data',                              \n  TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'),                                \n  12345.67\n)",
    "sourceDatabase": "ORACLE",
    "sqlExecutionTime": "2025-03-26 14:59:55",
    "sqlSequence": 1,
    "sqlType": "INSERT",
    "state": "BIZ_SQL_EXECUTE_FAIL",
    "tableName": "multi_tenant_test_2",
    "targetDatabases": ["GAUSSDB_ORACLE", "DM", "LIGHTDB_ORACLE"],
    "traceId": "73b77122206f49c993a9e73fbda7c458",
    "transformSqls": ["INSERT INTO multi_tenant_test_2 (char_column,varchar2_column,number_column,integer_column,date_column,varchar_column,timestamp_column,decimal_column) VALUES ('char_data ','varchar2_data',12345,123,TO_DATE('2023-01-01', 'YYYY-MM-DD'),'varchar_data',TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'),12345.67)", "INSERT INTO multi_tenant_test_2 (\n  char_column,\n  varchar2_column,\n  number_column,\n  integer_column,\n  date_column,\n  varchar_column,\n  timestamp_column,\n  decimal_column\n) VALUES (\n  'char_data ',                                \n  'varchar2_data',                             \n  12345,                                       \n  123,                                         \n  TO_DATE('2023-01-01', 'YYYY-MM-DD'),         \n  'varchar_data',                              \n  TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'),                                \n  12345.67\n)", "INSERT INTO multi_tenant_test_2 (char_column,varchar2_column,number_column,integer_column,date_column,varchar_column,timestamp_column,decimal_column) VALUES ('char_data ','varchar2_data',12345,123,TO_DATE('2023-01-01', 'YYYY-MM-DD'),'varchar_data',TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'),12345.67)"]
}