Files
oceanbase/unittest/sql/rewrite/test_trans_utils.cpp
oceanbase-admin cea7de1475 init push
2021-05-31 22:56:52 +08:00

134 lines
3.5 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#define USING_LOG_PREFIX \
SQL: \
q
#include "test_trans_utils.h"
#include <sql/rewrite/ob_transformer_impl.h>
#include <iostream>
namespace test {
const int TestTransUtils::trans_type_[9] = {
SIMPLIFY,
ANYALL,
AGGR,
ELIMINATE_OJ,
VIEW_MERGE,
WHERE_SQ_PULL_UP,
SET_OP,
};
bool TestTransUtils::parse_cmd(int argc, char* argv[], CmdLineParam& param)
{
bool ret = true;
int opt = 0;
const char* opt_string = "o:e:r:a:h";
struct option longopts[] = {{"all_rules", 1, NULL, 'a'},
{"only_rule", 1, NULL, 'o'},
{"except_rule", 1, NULL, 'e'},
{"rules", 1, NULL, 'r'},
{"help", 1, NULL, 'h'},
{0, 0, 0, 0}};
while ((opt = getopt_long(argc, argv, opt_string, longopts, NULL)) != -1) {
param.use_it_ = true;
switch (opt) {
case 'a': {
// default rules is already all
break;
}
case 'o': {
int tmp = static_cast<int>(strtol(optarg, NULL, 10));
if (tmp < 0 || tmp >= 9) {
return false;
}
std::cout << tmp << std::endl;
param.rules_ &= trans_type_[tmp];
break;
}
case 'e': {
int tmp = static_cast<int>(strtol(optarg, NULL, 10));
if (tmp < 0 || tmp >= 9) {
return false;
}
std::cout << tmp << std::endl;
param.rules_ &= ~trans_type_[tmp];
break;
}
case 'r': {
param.rules_ = INVALID_TRANSFORM_TYPE;
const char* split = ",";
char* c;
c = strtok(optarg, split);
while (c != NULL) {
if (*c < '0' || *c >= '9') {
return false;
}
int tmp = static_cast<int>(*c - '0');
std::cout << tmp << std::endl;
param.rules_ |= static_cast<TRANSFORM_TYPE>(trans_type_[tmp]);
c = strtok(NULL, split);
}
break;
}
case 'h': {
print_help();
break;
}
default: {
ret = false;
break;
}
}
}
return ret;
}
void TestTransUtils::print_help()
{
const char* options[] = {
"-a : apply all rules",
"-o : apply just rule x",
"-e : apply all rules except x",
"-r : apply rules(-r x,y,z...)",
NULL,
};
std::cout << "================ options begin =====================\n";
for (int i = 0; options[i] != NULL; ++i) {
std::cout << options[i] << "\n";
}
std::cout << "================ options end ======================\n";
std::cout << "\n";
const char* rules[] = {
"SIMPLIFY : 0",
"ANYALL : 1",
"AGGR : 2",
"ELIMINATE_OJ : 3",
"VIEW_MERGE : 4",
"WHERE_SQ_PULL_UP : 5",
"EQ_COND_PULL_UP : 6",
"PREDICATE_DEDUCE : 7",
NULL,
};
std::cout << "=============== rules number begin ========================\n";
for (int i = 0; rules[i] != NULL; ++i) {
std::cout << rules[i] << "\n";
}
std::cout << "=============== rules number end ========================\n";
}
} // namespace test