#include <string>
#include <vector>
#include <memory>
#include <variant>
#include <optional>
#define RNG(i,a,b) for(int i=(a),i##_end=(b); i<=i##_end; i++)
#define IRNG(i,a,b) for(int i=(a),i##_end=(b); i>=i##_end; i--)
using namespace std;
class Query;
class Column{
string name;
double ndv;
};
class Table{
string name;
vector<Column> columns;
};
class ColRef {
string table_name;
string col_name;
int id;
};
class SelectEntry {
ColRef col;
string alias;
};
class FromEntry {
string name;
string alias;
int id;
};
class WhereEntry {
ColRef lhs;
variant<ColRef, int, shared_ptr<Query>> rhs;
};
class Query {
vector<SelectEntry> select;
vector<FromEntry> from;
vector<WhereEntry> where;
enum Type { NormalQuery, SublinkRelated, SublinkNotRelated } type;
};