SQL Rewrite Test #
Target #
Facing logic databases and tables cannot be executed directly in actual databases. SQL rewrite is used to rewrite logic SQL into rightly executable ones in actual databases, including two parts, correctness rewrite and optimization rewrite. Rewrite tests are for these targets.
Test #
The rewrite tests are in the test folder under sharding-core/sharding-core-rewrite
. Followings are the main part for rewrite tests:
- test engine
- environment configuration
- assert data
Test engine is the entrance of rewrite tests, just like other test engines, through Junit Parameterized, read every and each data in the xml file under the target test type in test\resources
, and then assert by the engine one by one
Environment configuration is the yaml file under test type under test\resources\yaml
. The configuration file contains dataSources,shardingRule,encryptRule and other info. for example:
dataSources:
db: !!com.zaxxer.hikari.HikariDataSource
driverClassName: org.h2.Driver
jdbcUrl: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
username: sa
password:
## sharding Rules
rules:
- !SHARDING
tables:
t_account:
actualDataNodes: db.t_account_${0..1}
tableStrategy:
standard:
shardingColumn: account_id
shardingAlgorithmName: account_table_inline
keyGenerateStrategy:
column: account_id
keyGeneratorName: snowflake
t_account_detail:
actualDataNodes: db.t_account_detail_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: account_detail_table_inline
bindingTables:
- t_account, t_account_detail
shardingAlgorithms:
account_table_inline:
type: INLINE
props:
algorithm-expression: t_account_${account_id % 2}
account_detail_table_inline:
type: INLINE
props:
algorithm-expression: t_account_detail_${account_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
Assert data are in the xml under test type in test\resources
. In the xml file, yaml-rule
means the environment configuration file path, input
contains the target SQL and parameters, output
contains the expected SQL and parameters.
The db-type
described the type for SQL parse, default is SQL92
. For example:
<rewrite-assertions yaml-rule="yaml/sharding/sharding-rule.yaml">
<!-- to change SQL parse type, change db-type -->
<rewrite-assertion id="create_index_for_mysql" db-type="MySQL">
<input sql="CREATE INDEX index_name ON t_account ('status')" />
<output sql="CREATE INDEX index_name ON t_account_0 ('status')" />
<output sql="CREATE INDEX index_name ON t_account_1 ('status')" />
</rewrite-assertion>
</rewrite-assertions>
After setting up the assert data and environment configuration, rewrite test engine will assert the corresponding SQL without any Java code modification.