33#include " sqliteselect.h"
44#include " sqlitecolumntype.h"
55#include " sqlitefilterover.h"
6+ #include " sqliteorderby.h"
67#include " parser/statementtokenbuilder.h"
78#include " common/utils_sql.h"
89#include " common/global.h"
@@ -27,6 +28,7 @@ SqliteExpr::SqliteExpr(const SqliteExpr& other) :
2728 DEEP_COPY_FIELD (SqliteSelect, select);
2829 DEEP_COPY_FIELD (SqliteRaise, raiseFunction);
2930 DEEP_COPY_FIELD (SqliteFilterOver, filterOver);
31+ DEEP_COPY_COLLECTION (SqliteOrderBy, sortColumns);
3032}
3133
3234SqliteExpr::~SqliteExpr ()
@@ -176,6 +178,21 @@ void SqliteExpr::initFunction(const QString& fnName, int distinct, const QList<S
176178 expr->setParent (this );
177179}
178180
181+ void SqliteExpr::initFunction (const QString &fnName, int distinct, const QList<SqliteExpr *> &exprList, const QList<SqliteOrderBy*>& columns)
182+ {
183+ mode = SqliteExpr::Mode::FUNCTION ;
184+ function = fnName;
185+ this ->exprList = exprList;
186+ initDistinct (distinct);
187+ this ->sortColumns = columns;
188+
189+ for (SqliteOrderBy* orderBy : columns)
190+ orderBy->setParent (this );
191+
192+ for (SqliteExpr* expr : exprList)
193+ expr->setParent (this );
194+ }
195+
179196void SqliteExpr::initFunction (const QString& fnName, bool star)
180197{
181198 mode = SqliteExpr::Mode::FUNCTION ;
@@ -198,6 +215,25 @@ void SqliteExpr::initWindowFunction(const QString& fnName, int distinct, const Q
198215 filterOver->setParent (this );
199216}
200217
218+ void SqliteExpr::initWindowFunction (const QString &fnName, int distinct, const QList<SqliteExpr *> &exprList, const QList<SqliteOrderBy*>& columns, SqliteFilterOver *filterOver)
219+ {
220+ mode = SqliteExpr::Mode::WINDOW_FUNCTION ;
221+ this ->function = fnName;
222+ this ->exprList = exprList;
223+ initDistinct (distinct);
224+ this ->sortColumns = columns;
225+ this ->filterOver = filterOver;
226+
227+ for (SqliteOrderBy* orderBy : columns)
228+ orderBy->setParent (this );
229+
230+ for (SqliteExpr* expr : exprList)
231+ expr->setParent (this );
232+
233+ if (filterOver)
234+ filterOver->setParent (this );
235+ }
236+
201237void SqliteExpr::initWindowFunction (const QString& fnName, SqliteFilterOver* filterOver)
202238{
203239 mode = SqliteExpr::Mode::WINDOW_FUNCTION ;
@@ -209,6 +245,15 @@ void SqliteExpr::initWindowFunction(const QString& fnName, SqliteFilterOver* fil
209245 filterOver->setParent (this );
210246}
211247
248+ void SqliteExpr::initOrderedSetAggregate (const QString &fnName, int distinct, const QList<SqliteExpr *> &exprList, SqliteExpr *expr)
249+ {
250+ mode = SqliteExpr::Mode::ORDERED_SET_AGGREGATE ;
251+ this ->function = fnName;
252+ this ->exprList = exprList;
253+ initDistinct (distinct);
254+ this ->expr1 = expr;
255+ }
256+
212257void SqliteExpr::initBinOp (SqliteExpr *expr1, const QString& op, SqliteExpr *expr2)
213258{
214259 mode = SqliteExpr::Mode::BINARY_OP ;
@@ -386,10 +431,10 @@ void SqliteExpr::initCase(SqliteExpr *expr1, const QList<SqliteExpr*>& exprList,
386431 expr->setParent (this );
387432}
388433
389- void SqliteExpr::initRaise (const QString& type, const QString& text )
434+ void SqliteExpr::initRaise (const QString& type, SqliteExpr *expr )
390435{
391436 mode = SqliteExpr::Mode::RAISE ;
392- raiseFunction = new SqliteRaise (type, text );
437+ raiseFunction = new SqliteRaise (type, expr );
393438}
394439
395440void SqliteExpr::detectDoubleQuotes (bool recursively)
@@ -602,7 +647,17 @@ TokenList SqliteExpr::rebuildTokensFromContents()
602647 if (star)
603648 builder.withOperator (" *" ).withParRight ();
604649 else
605- builder.withStatementList (exprList).withParRight ();
650+ {
651+ builder.withStatementList (exprList);
652+ if (!sortColumns.isEmpty ())
653+ {
654+ builder
655+ .withSpace ().withKeyword (" ORDER" )
656+ .withSpace ().withKeyword (" BY" )
657+ .withSpace ().withStatementList (sortColumns);
658+ }
659+ builder.withParRight ();
660+ }
606661
607662 break ;
608663 case SqliteExpr::Mode::WINDOW_FUNCTION :
@@ -615,10 +670,42 @@ TokenList SqliteExpr::rebuildTokensFromContents()
615670 if (star)
616671 builder.withOperator (" *" ).withParRight ();
617672 else
618- builder.withStatementList (exprList).withParRight ();
619-
673+ {
674+ builder.withStatementList (exprList);
675+ if (!sortColumns.isEmpty ())
676+ {
677+ builder
678+ .withSpace ().withKeyword (" ORDER" )
679+ .withSpace ().withKeyword (" BY" )
680+ .withSpace ().withStatementList (sortColumns);
681+ }
682+ builder.withParRight ();
683+ }
620684 builder.withSpace ().withStatement (filterOver);
621685 break ;
686+ case SqliteExpr::Mode::ORDERED_SET_AGGREGATE :
687+ builder.withOther (function).withParLeft ();
688+ if (distinctKw)
689+ builder.withKeyword (" DISTINCT" );
690+ else if (allKw)
691+ builder.withKeyword (" ALL" );
692+
693+ builder
694+ .withStatementList (exprList)
695+ .withParRight ()
696+ .withSpace ()
697+ .withKeyword (" WITHIN" )
698+ .withSpace ()
699+ .withKeyword (" GROUP" )
700+ .withSpace ()
701+ .withParLeft ()
702+ .withKeyword (" ORDER" )
703+ .withSpace ()
704+ .withKeyword (" BY" )
705+ .withSpace ()
706+ .withStatement (expr1)
707+ .withParRight ();
708+ break ;
622709 case SqliteExpr::Mode::SUB_EXPR :
623710 builder.withParLeft ().withStatement (expr1).withParRight ();
624711 break ;
0 commit comments