1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
#ifndef SQLITEEXPR_H
#define SQLITEEXPR_H
#include "sqlitestatement.h"
#include <QString>
#include <QVariant>
#include <QList>
class SqliteFilterOver;
class SqliteSelect;
class SqliteColumnType;
class SqliteRaise;
class SqliteOrderBy;
class API_EXPORT SqliteExpr : public SqliteStatement
{
Q_OBJECT
public:
enum class Mode
{
null,
LITERAL_VALUE,
CTIME,
BIND_PARAM,
ID,
UNARY_OP,
BINARY_OP,
PTR_OP,
FUNCTION,
SUB_EXPR,
ROW_VALUE,
CAST,
COLLATE,
LIKE,
NULL_,
NOTNULL,
IS,
DISTINCT,
BETWEEN,
IN,
EXISTS,
CASE,
SUB_SELECT,
RAISE,
WINDOW_FUNCTION,
ORDERED_SET_AGGREGATE
};
enum class NotNull
{
ISNULL,
NOT_NULL,
NOTNULL,
null
};
enum class LikeOp
{
LIKE,
GLOB,
REGEXP,
MATCH,
null
};
SqliteExpr();
SqliteExpr(const SqliteExpr& other);
~SqliteExpr();
static LikeOp likeOp(const QString& value);
static QString likeOp(LikeOp value);
static NotNull notNullOp(const QString& value);
static QString notNullOp(NotNull value);
SqliteStatement* clone();
void initLiteral(const QVariant& value);
void initNull();
void initCTime(const QString& name);
void initSubExpr(SqliteExpr* expr);
void initRowValue(const QList<SqliteExpr*>& exprList);
void initId(const QString& db, const QString& table, const QString& column);
void initId(const QString& table, const QString& column);
void initId(const QString& column);
void initBindParam(const QString& value);
void initCollate(SqliteExpr* expr, const QString& value);
void initCast(SqliteExpr* expr, SqliteColumnType* type);
void initFunction(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList);
void initFunction(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList, const QList<SqliteOrderBy*>& columns);
void initFunction(const QString& fnName, bool star = false);
void initWindowFunction(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList, SqliteFilterOver* filterOver);
void initWindowFunction(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList,
const QList<SqliteOrderBy*>& columns, SqliteFilterOver* filterOver);
void initWindowFunction(const QString& fnName, SqliteFilterOver* filterOver);
void initOrderedSetAggregate(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList, SqliteExpr* expr);
void initBinOp(SqliteExpr* expr1, const QString& op, SqliteExpr* expr2);
void initUnaryOp(SqliteExpr* expr, const QString& op);
void initPtrOp(SqliteExpr* expr1, const QString& op, SqliteExpr* expr2);
void initLike(SqliteExpr* expr1, bool notKw, SqliteExpr::LikeOp likeOp, SqliteExpr* expr2, SqliteExpr* expr3 = nullptr);
void initNull(SqliteExpr* expr, const QString& value);
void initIs(SqliteExpr* expr1, bool notKw, SqliteExpr* expr2);
void initDistinct(SqliteExpr* expr1, bool notKw, SqliteExpr* expr2);
void initBetween(SqliteExpr* expr1, bool notKw, SqliteExpr* expr2, SqliteExpr* expr3);
void initIn(SqliteExpr* expr, bool notKw, const QList<SqliteExpr*>& exprList);
void initIn(SqliteExpr* expr, bool notKw, SqliteSelect* select);
void initIn(SqliteExpr* expr, bool notKw, const QString& name1, const QString& name2);
void initExists(SqliteSelect* select);
void initSubSelect(SqliteSelect* select);
void initCase(SqliteExpr* expr1, const QList<SqliteExpr*>& exprList, SqliteExpr* expr2);
void initRaise(const QString& type, SqliteExpr* expr = nullptr);
void detectDoubleQuotes(bool recursively = true);
bool replace(SqliteExpr* toBeReplaced, SqliteExpr* replaceWith);
Mode mode = Mode::null;
QVariant literalValue = QVariant();
bool literalNull = false;
QString bindParam = QString();
QString database = QString();
QString table = QString();
QString column = QString();
QString unaryOp = QString();
QString binaryOp = QString();
QString ptrOp = QString();
QString function = QString();
QString collation = QString();
QString ctime = QString();
SqliteColumnType* columnType = nullptr;
SqliteExpr* expr1 = nullptr;
SqliteExpr* expr2 = nullptr;
SqliteExpr* expr3 = nullptr;
QList<SqliteExpr*> exprList;
SqliteSelect* select = nullptr;
SqliteFilterOver* filterOver = nullptr;
bool distinctKw = false;
bool allKw = false; // alias for non-DISTINCT as for sqlite3 grammar
bool star = false;
bool notKw = false;
LikeOp like = LikeOp::null;
NotNull notNull = NotNull::null;
SqliteRaise* raiseFunction = nullptr;
bool possibleDoubleQuotedString = false;
bool originallySingleQuoteString = false;
QList<SqliteOrderBy*> sortColumns;
protected:
QStringList getColumnsInStatement();
QStringList getTablesInStatement();
QStringList getDatabasesInStatement();
TokenList getColumnTokensInStatement();
TokenList getTableTokensInStatement();
TokenList getDatabaseTokensInStatement();
QList<FullObject> getFullObjectsInStatement();
TokenList rebuildTokensFromContents();
void evaluatePostParsing();
private:
bool doubleQuotesChecked = false;
TokenList rebuildId();
TokenList rebuildLike();
TokenList rebuildNotNull();
TokenList rebuildIs();
TokenList rebuildDistinct();
TokenList rebuildBetween();
TokenList rebuildIn();
TokenList rebuildCase();
void initDistinct(int distinct);
};
typedef QSharedPointer<SqliteExpr> SqliteExprPtr;
#endif // SQLITEEXPR_H
|