aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteexpr.h
blob: f5fc6c2f3ecfe9757b2c51071badecfda9a9a8d9 (plain) (blame)
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
#ifndef SQLITEEXPR_H
#define SQLITEEXPR_H

#include "sqlitestatement.h"
#include <QString>
#include <QVariant>
#include <QList>

class SqliteFilterOver;
class SqliteSelect;
class SqliteColumnType;
class SqliteRaise;

class API_EXPORT SqliteExpr : public SqliteStatement
{
    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
        };

        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, bool star = false);
        void initWindowFunction(const QString& fnName, int distinct, const QList<SqliteExpr*>& exprList, SqliteFilterOver* filterOver);
        void initWindowFunction(const QString& fnName, SqliteFilterOver* filterOver);
        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, const QString& text = QString());
        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 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;

    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