231 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "../avro_schema.cc"
 | |
| #include "../rpl.cc"
 | |
| 
 | |
| static struct
 | |
| {
 | |
|     const char* statement;
 | |
|     const char* target;
 | |
|     bool        rval;
 | |
| } data[] =
 | |
| {
 | |
|     {"/*!40000 ALTER TABLE `t1` DISABLE KEYS */",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"/*!40000 ALTER TABLE `t1` ENABLE KEYS */",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ADD COLUMN `a` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ADD COLUMN `a`",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `account_id` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `amount` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `app_id` VARCHAR(64)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `create_time` DATETIME",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter TABLE t1 add `end_time` varchar(10) DEFAULT NULL COMMENT 'this is a comment'",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `expire_time` DATETIME",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `id_a` VARCHAR(128)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `id` BIGINT(20)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `id` VARCHAR(64)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `node_state` INT(4)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `no` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `order_id` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter TABLE t1 add `start_time` varchar(10) DEFAULT NULL COMMENT 'this is a comment'",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `status` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `task_id` BIGINT(20)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter TABLE t1 add `undo` int(1) DEFAULT '0' COMMENT 'this is a comment'",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table `t1` add unique (`a`,`id`)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table `t1` add unique (`a`)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table `t1` add UNIQUE(`a`)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD UNIQUE `idx_id` USING BTREE (`id`, `result`)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `update_time` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` ADD `username` VARCHAR(16)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` AUTO_INCREMENT = 1",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `account_id` `account_id` BIGINT(20)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `amount` `amount` DECIMAL(32,2)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `app_id` `app_id` VARCHAR(64)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `business_id` `business_id` VARCHAR(128)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `business_id` `business_id` VARCHAR(64)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `business_unique_no` `business_unique_no` VARCHAR(64)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `expire_time` `expire_time` DATETIME",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `id_a` `id_a` VARCHAR(128)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `id` `id` BIGINT(20)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `node_state` `node_state` INT(4)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `order_id` `order_id` BIGINT(20)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `status` `status` INT(1)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `update_time` `update_time` TIMESTAMP",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE `username` `username` VARCHAR(16)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` COMMENT = 'a comment'",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table `t1` drop index a",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table t1 drop index t1_idx",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"alter table t1 index(account_id, business_id)",
 | |
|      NULL,
 | |
|      false},
 | |
|     {
 | |
|         "ALTER TABLE `t1` MODIFY COLUMN `expire_time` DATETIME DEFAULT NULL COMMENT 'this is a comment' AFTER `update_time`",
 | |
|         "update_time",
 | |
|         true
 | |
|     },
 | |
|     {
 | |
|         "ALTER TABLE `t1` MODIFY COLUMN `id_a` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'this is a comment' AFTER `username`",
 | |
|         "username",
 | |
|         true
 | |
|     },
 | |
|     {
 | |
|         "ALTER TABLE `t1` MODIFY COLUMN `number` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'this is a comment' AFTER `business_id`",
 | |
|         "business_id",
 | |
|         true
 | |
|     },
 | |
|     {
 | |
|         "ALTER TABLE `t1` MODIFY COLUMN `task_id` BIGINT(20) DEFAULT NULL COMMENT 'this is a comment' AFTER `business_id`",
 | |
|         "business_id",
 | |
|         true
 | |
|     },
 | |
|     {
 | |
|         "ALTER TABLE `t1` MODIFY COLUMN `username` VARCHAR(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'this is a comment' AFTER `business_id`",
 | |
|         "business_id",
 | |
|         true
 | |
|     },
 | |
|     {"ALTER TABLE `t1` RENAME `t2`",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `db1`.`t1` ADD COLUMN `num` varchar(32) COMMENT 'this is a comment' AFTER `bank_name`",
 | |
|      "bank_name",
 | |
|      true},
 | |
|     {"ALTER TABLE `db1`.`t1` ADD INDEX `idx_node_state` USING BTREE (`node_state`) comment ''",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `db1`.`t1` CHANGE COLUMN `num` `code` varchar(32) DEFAULT NULL COMMENT 'this is a comment'",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `db1`.`t1` DROP INDEX `a`, ADD INDEX `a` USING BTREE (`a`) comment ''",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `db1`.`t1` DROP INDEX `a`, ADD INDEX `idx_a` USING BTREE (`a`) comment ''",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` CHANGE COLUMN `a` `c` INT AFTER `b`",
 | |
|      "b",
 | |
|      true},
 | |
|     {"ALTER TABLE `t1` CHANGE COLUMN `a` `c` INT first",
 | |
|      NULL,
 | |
|      true},
 | |
|     {"ALTER TABLE `t1` CHANGE COLUMN `a` `c` INT",
 | |
|      NULL,
 | |
|      false},
 | |
|     {"ALTER TABLE `t1` MODIFY COLUMN `a` INT PRIMARY KEY",
 | |
|      NULL,
 | |
|      false},
 | |
|     {NULL}
 | |
| };
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|     int rval = 0;
 | |
| 
 | |
|     for (int i = 0; data[i].statement; i++)
 | |
|     {
 | |
|         const char* target = NULL;
 | |
|         int len = 0;
 | |
|         const char* stmt = data[i].statement;
 | |
|         const char* end = data[i].statement + strlen(data[i].statement);
 | |
| 
 | |
|         if (get_placement_specifier(stmt, end, &target, &len) != data[i].rval)
 | |
|         {
 | |
|             const char* a = data[i].rval ? "true" : "false";
 | |
|             const char* b = data[i].rval ? "false" : "true";
 | |
|             printf("Expected '%s', got '%s' for '%s'\n", a, b, data[i].statement);
 | |
|             rval++;
 | |
|         }
 | |
|         else if (((bool)data[i].target != (bool)target) || (strncmp(target, data[i].target, len) != 0))
 | |
|         {
 | |
|             printf("Expected '%s', got '%.*s' for '%s'\n", data[i].target, len, target, data[i].statement);
 | |
|             rval++;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return rval;
 | |
| }
 | 
