parse_defs.h 7.1 KB
Newer Older
羽飞's avatar
羽飞 已提交
1
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
羽飞's avatar
羽飞 已提交
2 3 4 5 6 7 8 9 10 11
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
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 PSL v2 for more details. */

//
12
// Created by Meiyi
羽飞's avatar
羽飞 已提交
13 14
//

羽飞's avatar
羽飞 已提交
15
#pragma once
羽飞's avatar
羽飞 已提交
16 17

#include <stddef.h>
羽飞's avatar
羽飞 已提交
18 19 20
#include <memory>
#include <vector>
#include <string>
羽飞's avatar
羽飞 已提交
21

羽飞's avatar
羽飞 已提交
22 23
#include "sql/parser/value.h"

羽飞's avatar
羽飞 已提交
24 25 26 27 28 29
/**
 * @brief 描述一个属性
 * @details 属性,或者说字段(column, field)
 * Rel -> Relation
 * Attr -> Attribute
 */
羽飞's avatar
羽飞 已提交
30 31
struct RelAttr 
{
羽飞's avatar
羽飞 已提交
32 33
  std::string relation_name;   ///< relation name (may be NULL) 表名
  std::string attribute_name;  ///< attribute name              属性名
羽飞's avatar
羽飞 已提交
34
};
羽飞's avatar
羽飞 已提交
35

羽飞's avatar
羽飞 已提交
36 37 38
/**
 * @brief 描述比较运算符
 */
羽飞's avatar
羽飞 已提交
39 40
enum CompOp 
{
羽飞's avatar
羽飞 已提交
41 42 43 44 45 46 47
  EQUAL_TO,     //"="     0
  LESS_EQUAL,   //"<="    1
  NOT_EQUAL,    //"<>"    2
  LESS_THAN,    //"<"     3
  GREAT_EQUAL,  //">="    4
  GREAT_THAN,   //">"     5
  NO_OP
羽飞's avatar
羽飞 已提交
48
};
羽飞's avatar
羽飞 已提交
49

羽飞's avatar
羽飞 已提交
50 51 52 53 54 55 56
/**
 * @brief 表示一个条件比较
 * @details 条件比较就是SQL查询中的 where a>b 这种。
 * 一个条件比较是有两部分组成的,称为左边和右边。
 * 左边和右边理论上都可以是任意的数据,比如是字段(属性,列),也可以是数值常量。
 * 这个结构中记录的仅仅支持字段和值。
 */
羽飞's avatar
羽飞 已提交
57 58
struct Condition
{
羽飞's avatar
羽飞 已提交
59 60 61 62 63 64 65 66 67
  int left_is_attr;    /// TRUE if left-hand side is an attribute
                       /// 1时,操作符左边是属性名,0时,是属性值
  Value left_value;    /// left-hand side value if left_is_attr = FALSE
  RelAttr left_attr;   /// left-hand side attribute
  CompOp comp;         /// comparison operator
  int right_is_attr;   /// TRUE if right-hand side is an attribute
                       /// 1时,操作符右边是属性名,0时,是属性值
  RelAttr right_attr;  /// right-hand side attribute if right_is_attr = TRUE 右边的属性
  Value right_value;   /// right-hand side value if right_is_attr = FALSE
羽飞's avatar
羽飞 已提交
68
};
羽飞's avatar
羽飞 已提交
69

羽飞's avatar
羽飞 已提交
70 71 72 73 74 75 76 77 78
/**
 * @brief 描述一个select语句
 * @details 一个正常的select语句描述起来比这个要复杂很多,这里做了简化。
 * 一个select语句由三部分组成,分别是select, from, where。
 * select部分表示要查询的字段,from部分表示要查询的表,where部分表示查询的条件。
 * 比如 from 中可以是多个表,也可以是另一个查询语句,这里仅仅支持表,也就是 relations。
 * where 条件 conditions,这里表示使用AND串联起来多个条件。正常的SQL语句会有OR,NOT等,
 * 甚至可以包含复杂的表达式。
 */
羽飞's avatar
羽飞 已提交
79 80
struct Selects
{
羽飞's avatar
羽飞 已提交
81 82 83
  std::vector<RelAttr> attributes;    ///< attributes in select clause
  std::vector<std::string> relations; ///< 查询的表
  std::vector<Condition> conditions;  ///< 查询条件,使用AND串联起来多个条件
羽飞's avatar
羽飞 已提交
84
};
羽飞's avatar
羽飞 已提交
85

羽飞's avatar
羽飞 已提交
86 87 88 89
/**
 * @brief 描述一个insert语句
 * @details 于Selects类似,也做了很多简化
 */
羽飞's avatar
羽飞 已提交
90 91
struct Inserts
{
羽飞's avatar
羽飞 已提交
92 93
  std::string relation_name;  ///< Relation to insert into
  std::vector<Value> values;  ///< 要插入的值
羽飞's avatar
羽飞 已提交
94
};
羽飞's avatar
羽飞 已提交
95

羽飞's avatar
羽飞 已提交
96 97 98
/**
 * @brief 描述一个delete语句
 */
羽飞's avatar
羽飞 已提交
99 100
struct Deletes
{
L
Longda Feng 已提交
101
  std::string relation_name;  // Relation to delete from
羽飞's avatar
羽飞 已提交
102 103
  std::vector<Condition> conditions;
};
羽飞's avatar
羽飞 已提交
104

羽飞's avatar
羽飞 已提交
105 106 107 108
/**
 * @brief 描述一个update语句
 * 
 */
羽飞's avatar
羽飞 已提交
109 110
struct Updates
{
羽飞's avatar
羽飞 已提交
111 112 113
  std::string relation_name;   ///< Relation to update
  std::string attribute_name;  ///< 更新的字段,仅支持一个字段
  Value value;                 ///< 更新的值,仅支持一个字段
羽飞's avatar
羽飞 已提交
114 115 116
  std::vector<Condition> conditions;
};

羽飞's avatar
羽飞 已提交
117 118 119 120 121 122
/**
 * @brief 描述一个属性
 * @details 属性,或者说字段(column, field)
 * Rel -> Relation
 * Attr -> Attribute
 */
羽飞's avatar
羽飞 已提交
123 124
struct AttrInfo
{
羽飞's avatar
羽飞 已提交
125 126 127
  AttrType type;     ///< Type of attribute
  std::string name;  ///< Attribute name
  size_t length;     ///< Length of attribute
羽飞's avatar
羽飞 已提交
128
};
羽飞's avatar
羽飞 已提交
129

羽飞's avatar
羽飞 已提交
130 131 132 133
/**
 * @brief 描述一个create table语句
 * @details 这里也做了很多简化。
 */
羽飞's avatar
羽飞 已提交
134 135
struct CreateTable
{
L
Longda Feng 已提交
136 137
  std::string relation_name;         // Relation name
  std::vector<AttrInfo> attr_infos;  // attributes
羽飞's avatar
羽飞 已提交
138
};
羽飞's avatar
羽飞 已提交
139

羽飞's avatar
羽飞 已提交
140 141 142 143
/**
 * @brief 描述一个drop table语句
 * 
 */
羽飞's avatar
羽飞 已提交
144 145
struct DropTable
{
羽飞's avatar
羽飞 已提交
146
  std::string relation_name;  /// 要删除的表名
羽飞's avatar
羽飞 已提交
147
};
羽飞's avatar
羽飞 已提交
148

羽飞's avatar
羽飞 已提交
149 150 151 152 153
/**
 * @brief 描述一个create index语句
 * @details 创建索引时,需要指定索引名,表名,字段名。
 * 正常的SQL语句中,一个索引可能包含了多个字段,这里仅支持一个字段。
 */
羽飞's avatar
羽飞 已提交
154 155
struct CreateIndex
{
羽飞's avatar
羽飞 已提交
156 157 158
  std::string index_name;      /// Index name
  std::string relation_name;   /// Relation name
  std::string attribute_name;  /// Attribute name
羽飞's avatar
羽飞 已提交
159
};
羽飞's avatar
羽飞 已提交
160

羽飞's avatar
羽飞 已提交
161 162 163 164
/**
 * @brief 描述一个drop index语句
 * 
 */
羽飞's avatar
羽飞 已提交
165 166
struct DropIndex
{
羽飞's avatar
羽飞 已提交
167 168
  std::string index_name;     ///< Index name
  std::string relation_name;  ///< Relation name
羽飞's avatar
羽飞 已提交
169 170
};

羽飞's avatar
羽飞 已提交
171 172 173 174
/**
 * @brief 描述一个desc table语句
 * @details desc table 是查询表结构信息的语句
 */
羽飞's avatar
羽飞 已提交
175 176
struct DescTable
{
羽飞's avatar
羽飞 已提交
177 178 179
  std::string relation_name;
};

羽飞's avatar
羽飞 已提交
180 181 182 183
/**
 * @brief 描述一个load data语句
 * @details 从文件导入数据到表中。文件中的每一行就是一条数据,每行的数据类型、字段个数都与表保持一致
 */
羽飞's avatar
羽飞 已提交
184 185
struct LoadData
{
羽飞's avatar
羽飞 已提交
186 187 188 189
  std::string relation_name;
  std::string file_name;
};

羽飞's avatar
羽飞 已提交
190 191 192 193 194 195
struct SetVariable
{
  std::string name;
  Value value;
};

196
class Command;
羽飞's avatar
羽飞 已提交
197 198 199 200 201 202 203

/**
 * @brief 描述一个explain语句
 * @details 会创建operator的语句,才能用explain输出执行计划。
 * 一个command就是一个语句,比如select语句,insert语句等。
 * 可能改成SqlCommand更合适。
 */
羽飞's avatar
羽飞 已提交
204 205
struct Explain
{
206
  std::unique_ptr<Command> cmd;
羽飞's avatar
羽飞 已提交
207 208
};

羽飞's avatar
羽飞 已提交
209 210 211 212
/**
 * @brief 解析SQL语句出现了错误
 * @details 当前解析时并没有处理错误的行号和列号
 */
羽飞's avatar
羽飞 已提交
213 214
struct Error
{
羽飞's avatar
羽飞 已提交
215 216 217
  std::string error_msg;
  int line;
  int column;
羽飞's avatar
羽飞 已提交
218 219
};

羽飞's avatar
羽飞 已提交
220 221 222 223
/**
 * @brief 表示一个SQL语句的类型
 * 
 */
羽飞's avatar
羽飞 已提交
224 225
enum SqlCommandFlag
{
羽飞's avatar
羽飞 已提交
226 227 228 229 230 231 232 233 234 235 236 237
  SCF_ERROR = 0,
  SCF_SELECT,
  SCF_INSERT,
  SCF_UPDATE,
  SCF_DELETE,
  SCF_CREATE_TABLE,
  SCF_DROP_TABLE,
  SCF_CREATE_INDEX,
  SCF_DROP_INDEX,
  SCF_SYNC,
  SCF_SHOW_TABLES,
  SCF_DESC_TABLE,
羽飞's avatar
羽飞 已提交
238
  SCF_BEGIN,        ///< 事务开始语句,可以在这里扩展只读事务
羽飞's avatar
羽飞 已提交
239
  SCF_COMMIT,
羽飞's avatar
羽飞 已提交
240
  SCF_CLOG_SYNC,
羽飞's avatar
羽飞 已提交
241 242 243
  SCF_ROLLBACK,
  SCF_LOAD_DATA,
  SCF_HELP,
羽飞's avatar
羽飞 已提交
244 245
  SCF_EXIT,
  SCF_EXPLAIN,
羽飞's avatar
羽飞 已提交
246
  SCF_SET_VARIABLE, ///< 设置变量
羽飞's avatar
羽飞 已提交
247
};
羽飞's avatar
羽飞 已提交
248 249 250 251
/**
 * @brief 表示一个SQL语句
 * 
 */
羽飞's avatar
羽飞 已提交
252 253
class Command
{
羽飞's avatar
羽飞 已提交
254
public:
羽飞's avatar
羽飞 已提交
255
  enum SqlCommandFlag flag;
L
Longda Feng 已提交
256 257 258 259 260 261 262 263 264 265 266 267
  Error error;
  Selects selection;
  Inserts insertion;
  Deletes deletion;
  Updates update;
  CreateTable create_table;
  DropTable drop_table;
  CreateIndex create_index;
  DropIndex drop_index;
  DescTable desc_table;
  LoadData load_data;
  Explain explain;
羽飞's avatar
羽飞 已提交
268
  SetVariable set_variable;
羽飞's avatar
羽飞 已提交
269 270

public:
271
  Command();
羽飞's avatar
羽飞 已提交
272
  explicit Command(SqlCommandFlag flag);
羽飞's avatar
羽飞 已提交
273
};
羽飞's avatar
羽飞 已提交
274

羽飞's avatar
羽飞 已提交
275
/**
羽飞's avatar
羽飞 已提交
276
 * @brief 表示语法解析后的数据
羽飞's avatar
羽飞 已提交
277 278
 * 叫ParsedSqlNode 可能会更清晰一点
 */
羽飞's avatar
羽飞 已提交
279 280
class ParsedSqlResult
{
羽飞's avatar
羽飞 已提交
281
public:
282
  void add_command(std::unique_ptr<Command> command);
L
Longda Feng 已提交
283 284 285 286 287
  std::vector<std::unique_ptr<Command>> &commands()
  {
    return sql_commands_;
  }

羽飞's avatar
羽飞 已提交
288
private:
羽飞's avatar
羽飞 已提交
289
  std::vector<std::unique_ptr<Command>> sql_commands_;  ///< 这里记录SQL命令。虽然看起来支持多个,但是当前仅处理一个
羽飞's avatar
羽飞 已提交
290
};