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

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

羽飞's avatar
羽飞 已提交
48 49 50 51
/**
 * @brief 属性的类型
 * 
 */
羽飞's avatar
羽飞 已提交
52 53
enum AttrType
{
羽飞's avatar
羽飞 已提交
54
  UNDEFINED,
羽飞's avatar
羽飞 已提交
55 56 57 58
  CHARS,          /// 字符串类型
  INTS,           /// 整数类型(4字节)
  FLOATS,         /// 浮点数类型(4字节)
  BOOLEANS,       /// boolean类型,当前不是由parser解析出来的,是程序内部使用的
羽飞's avatar
羽飞 已提交
59
};
羽飞's avatar
羽飞 已提交
60

羽飞's avatar
羽飞 已提交
61 62 63 64
/**
 * @brief 属性的值
 * 
 */
羽飞's avatar
羽飞 已提交
65 66
struct Value
{
羽飞's avatar
羽飞 已提交
67 68 69 70 71
  AttrType    type;           /// 属性的类型
  int         int_value;      /// 如果是整数,这个值就有意义
  float       float_value;    /// 如果是浮点数,这个值就有意义
  bool        bool_value;     /// 如果是boolean值,这个值就有意义
  std::string string_value;   /// 如果是字符串,这个值就有意义
羽飞's avatar
羽飞 已提交
72

羽飞's avatar
羽飞 已提交
73 74
  const char *data() const;   /// 获取值的内存地址
  int length();               /// 获取占用的内存长度
羽飞's avatar
羽飞 已提交
75
};
羽飞's avatar
羽飞 已提交
76

羽飞's avatar
羽飞 已提交
77 78 79 80 81 82 83
/**
 * @brief 表示一个条件比较
 * @details 条件比较就是SQL查询中的 where a>b 这种。
 * 一个条件比较是有两部分组成的,称为左边和右边。
 * 左边和右边理论上都可以是任意的数据,比如是字段(属性,列),也可以是数值常量。
 * 这个结构中记录的仅仅支持字段和值。
 */
羽飞's avatar
羽飞 已提交
84 85
struct Condition
{
羽飞's avatar
羽飞 已提交
86 87 88 89 90 91 92 93 94
  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
羽飞 已提交
95
};
羽飞's avatar
羽飞 已提交
96

羽飞's avatar
羽飞 已提交
97 98 99 100 101 102 103 104 105
/**
 * @brief 描述一个select语句
 * @details 一个正常的select语句描述起来比这个要复杂很多,这里做了简化。
 * 一个select语句由三部分组成,分别是select, from, where。
 * select部分表示要查询的字段,from部分表示要查询的表,where部分表示查询的条件。
 * 比如 from 中可以是多个表,也可以是另一个查询语句,这里仅仅支持表,也就是 relations。
 * where 条件 conditions,这里表示使用AND串联起来多个条件。正常的SQL语句会有OR,NOT等,
 * 甚至可以包含复杂的表达式。
 */
羽飞's avatar
羽飞 已提交
106 107
struct Selects
{
羽飞's avatar
羽飞 已提交
108 109 110
  std::vector<RelAttr> attributes;    /// attributes in select clause
  std::vector<std::string> relations; /// 查询的表
  std::vector<Condition> conditions;  /// 查询条件,使用AND串联起来多个条件
羽飞's avatar
羽飞 已提交
111
};
羽飞's avatar
羽飞 已提交
112

羽飞's avatar
羽飞 已提交
113 114 115 116
/**
 * @brief 描述一个insert语句
 * @details 于Selects类似,也做了很多简化
 */
羽飞's avatar
羽飞 已提交
117 118
struct Inserts
{
羽飞's avatar
羽飞 已提交
119 120
  std::string relation_name;  /// Relation to insert into
  std::vector<Value> values;  /// 要插入的值
羽飞's avatar
羽飞 已提交
121
};
羽飞's avatar
羽飞 已提交
122

羽飞's avatar
羽飞 已提交
123 124 125
/**
 * @brief 描述一个delete语句
 */
羽飞's avatar
羽飞 已提交
126 127
struct Deletes
{
L
Longda Feng 已提交
128
  std::string relation_name;  // Relation to delete from
羽飞's avatar
羽飞 已提交
129 130
  std::vector<Condition> conditions;
};
羽飞's avatar
羽飞 已提交
131

羽飞's avatar
羽飞 已提交
132 133 134 135
/**
 * @brief 描述一个update语句
 * 
 */
羽飞's avatar
羽飞 已提交
136 137
struct Updates
{
L
Longda Feng 已提交
138
  std::string relation_name;   // Relation to update
羽飞's avatar
羽飞 已提交
139 140
  std::string attribute_name;  /// 更新的字段,仅支持一个字段
  Value value;                 /// 更新的值,仅支持一个字段
羽飞's avatar
羽飞 已提交
141 142 143
  std::vector<Condition> conditions;
};

羽飞's avatar
羽飞 已提交
144 145 146 147 148 149
/**
 * @brief 描述一个属性
 * @details 属性,或者说字段(column, field)
 * Rel -> Relation
 * Attr -> Attribute
 */
羽飞's avatar
羽飞 已提交
150 151
struct AttrInfo
{
羽飞's avatar
羽飞 已提交
152 153 154
  AttrType type;     /// Type of attribute
  std::string name;  /// Attribute name
  size_t length;     /// Length of attribute
羽飞's avatar
羽飞 已提交
155
};
羽飞's avatar
羽飞 已提交
156

羽飞's avatar
羽飞 已提交
157 158 159 160
/**
 * @brief 描述一个create table语句
 * @details 这里也做了很多简化。
 */
羽飞's avatar
羽飞 已提交
161 162
struct CreateTable
{
L
Longda Feng 已提交
163 164
  std::string relation_name;         // Relation name
  std::vector<AttrInfo> attr_infos;  // attributes
羽飞's avatar
羽飞 已提交
165
};
羽飞's avatar
羽飞 已提交
166

羽飞's avatar
羽飞 已提交
167 168 169 170
/**
 * @brief 描述一个drop table语句
 * 
 */
羽飞's avatar
羽飞 已提交
171 172
struct DropTable
{
羽飞's avatar
羽飞 已提交
173
  std::string relation_name;  /// 要删除的表名
羽飞's avatar
羽飞 已提交
174
};
羽飞's avatar
羽飞 已提交
175

羽飞's avatar
羽飞 已提交
176 177 178 179 180
/**
 * @brief 描述一个create index语句
 * @details 创建索引时,需要指定索引名,表名,字段名。
 * 正常的SQL语句中,一个索引可能包含了多个字段,这里仅支持一个字段。
 */
羽飞's avatar
羽飞 已提交
181 182
struct CreateIndex
{
羽飞's avatar
羽飞 已提交
183 184 185
  std::string index_name;      /// Index name
  std::string relation_name;   /// Relation name
  std::string attribute_name;  /// Attribute name
羽飞's avatar
羽飞 已提交
186
};
羽飞's avatar
羽飞 已提交
187

羽飞's avatar
羽飞 已提交
188 189 190 191
/**
 * @brief 描述一个drop index语句
 * 
 */
羽飞's avatar
羽飞 已提交
192 193
struct DropIndex
{
L
Longda Feng 已提交
194 195
  std::string index_name;     // Index name
  std::string relation_name;  // Relation name
羽飞's avatar
羽飞 已提交
196 197
};

羽飞's avatar
羽飞 已提交
198 199 200 201
/**
 * @brief 描述一个desc table语句
 * @details desc table 是查询表结构信息的语句
 */
羽飞's avatar
羽飞 已提交
202 203
struct DescTable
{
羽飞's avatar
羽飞 已提交
204 205 206
  std::string relation_name;
};

羽飞's avatar
羽飞 已提交
207 208 209 210
/**
 * @brief 描述一个load data语句
 * @details 从文件导入数据到表中。文件中的每一行就是一条数据,每行的数据类型、字段个数都与表保持一致
 */
羽飞's avatar
羽飞 已提交
211 212
struct LoadData
{
羽飞's avatar
羽飞 已提交
213 214 215 216
  std::string relation_name;
  std::string file_name;
};

217
class Command;
羽飞's avatar
羽飞 已提交
218 219 220 221 222 223 224

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

羽飞's avatar
羽飞 已提交
230 231 232 233
/**
 * @brief 解析SQL语句出现了错误
 * @details 当前解析时并没有处理错误的行号和列号
 */
羽飞's avatar
羽飞 已提交
234 235
struct Error
{
羽飞's avatar
羽飞 已提交
236 237 238
  std::string error_msg;
  int line;
  int column;
羽飞's avatar
羽飞 已提交
239 240
};

羽飞's avatar
羽飞 已提交
241 242 243 244
/**
 * @brief 表示一个SQL语句的类型
 * 
 */
羽飞's avatar
羽飞 已提交
245 246
enum SqlCommandFlag
{
羽飞's avatar
羽飞 已提交
247 248 249 250 251 252 253 254 255 256 257 258
  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
羽飞 已提交
259
  SCF_BEGIN,        /// 事务开始语句,可以在这里扩展只读事务
羽飞's avatar
羽飞 已提交
260
  SCF_COMMIT,
羽飞's avatar
羽飞 已提交
261
  SCF_CLOG_SYNC,
羽飞's avatar
羽飞 已提交
262 263 264
  SCF_ROLLBACK,
  SCF_LOAD_DATA,
  SCF_HELP,
羽飞's avatar
羽飞 已提交
265 266
  SCF_EXIT,
  SCF_EXPLAIN,
羽飞's avatar
羽飞 已提交
267
};
羽飞's avatar
羽飞 已提交
268 269 270 271
/**
 * @brief 表示一个SQL语句
 * 
 */
羽飞's avatar
羽飞 已提交
272 273
class Command
{
羽飞's avatar
羽飞 已提交
274
public:
羽飞's avatar
羽飞 已提交
275
  enum SqlCommandFlag flag;
L
Longda Feng 已提交
276 277 278 279 280 281 282 283 284 285 286 287
  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
羽飞 已提交
288 289

public:
290
  Command();
羽飞's avatar
羽飞 已提交
291
  explicit Command(SqlCommandFlag flag);
羽飞's avatar
羽飞 已提交
292
};
羽飞's avatar
羽飞 已提交
293

羽飞's avatar
羽飞 已提交
294
/**
羽飞's avatar
羽飞 已提交
295
 * @brief 表示语法解析后的数据
羽飞's avatar
羽飞 已提交
296 297
 * 叫ParsedSqlNode 可能会更清晰一点
 */
羽飞's avatar
羽飞 已提交
298 299
class ParsedSqlResult
{
羽飞's avatar
羽飞 已提交
300
public:
301
  void add_command(std::unique_ptr<Command> command);
L
Longda Feng 已提交
302 303 304 305 306
  std::vector<std::unique_ptr<Command>> &commands()
  {
    return sql_commands_;
  }

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

羽飞's avatar
羽飞 已提交
311 312
const char *attr_type_to_string(AttrType type);
AttrType attr_type_from_string(const char *s);