#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;

};