Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Change the parser on this branch to more closely match trunk. This saves a few more cycles. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | filter-clause |
Files: | files | file ages | folders |
SHA3-256: |
be01b801fbc258f0ab9542130cec12a5 |
User & Date: | dan 2019-07-11 18:43:33.538 |
Context
2019-07-12
| ||
15:15 | Minor performance improvement in vdbeRecordCompareString(). (check-in: 777fec84a5 user: dan tags: filter-clause) | |
2019-07-11
| ||
18:43 | Change the parser on this branch to more closely match trunk. This saves a few more cycles. (check-in: be01b801fb user: dan tags: filter-clause) | |
2019-07-10
| ||
20:16 | Minor performance improvement in sqlite3ExprDeleteNN(). (check-in: bcc8b38ac7 user: dan tags: filter-clause) | |
Changes
Changes to src/parse.y.
︙ | ︙ | |||
1032 1033 1034 1035 1036 1037 1038 | expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); sqlite3ExprAttachSubtrees(pParse->db, A, E, 0); } %endif SQLITE_OMIT_CAST | < < > > > > > > > > > > | | | | | 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 | expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); sqlite3ExprAttachSubtrees(pParse->db, A, E, 0); } %endif SQLITE_OMIT_CAST expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. { A = sqlite3ExprFunction(pParse, Y, &X, D); } expr(A) ::= id(X) LP STAR RP. { A = sqlite3ExprFunction(pParse, 0, &X, 0); } %ifndef SQLITE_OMIT_WINDOWFUNC %type filter_over { struct FunctionTail { Window *pWin; Expr *pFilter; } } %destructor filter_over { sqlite3WindowDelete(pParse->db, $$.pWin); sqlite3ExprDelete(pParse->db, $$.pFilter); } expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(F). { A = sqlite3ExprFunction(pParse, Y, &X, D); sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); } expr(A) ::= id(X) LP STAR RP filter_over(F). { A = sqlite3ExprFunction(pParse, 0, &X, 0); sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); } %endif term(A) ::= CTIME_KW(OP). { A = sqlite3ExprFunction(pParse, 0, &OP, 0); } |
︙ | ︙ | |||
1655 1656 1657 1658 1659 1660 1661 | %type frame_opt {Window*} %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);} %type part_opt {ExprList*} %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);} | | | > > > | 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 | %type frame_opt {Window*} %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);} %type part_opt {ExprList*} %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);} %type filter_clause {Expr*} %destructor filter_clause {sqlite3ExprDelete(pParse->db, $$);} %type over_clause {Window*} %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);} %type range_or_rows {int} %type frame_bound {struct FrameBound} %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);} %type frame_bound_s {struct FrameBound} %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);} |
︙ | ︙ | |||
1722 1723 1724 1725 1726 1727 1728 | frame_exclude(A) ::= GROUP|TIES(X). {A = @X; /*A-overwrites-X*/} %type window_clause {Window*} %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);} window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; } | > > | > | > > > > > > > | | | < | | 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 | frame_exclude(A) ::= GROUP|TIES(X). {A = @X; /*A-overwrites-X*/} %type window_clause {Window*} %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);} window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; } filter_over(F) ::= filter_clause(A) over_clause(B). { F.pFilter = A; F.pWin = B; } filter_over(F) ::= over_clause(B). { F.pFilter = 0; F.pWin = B; } filter_over(F) ::= filter_clause(A). { F.pFilter = A; F.pWin = 0; } over_clause(A) ::= OVER LP window(Z) RP. { A = Z; assert( A!=0 ); } over_clause(A) ::= OVER nm(Z). { A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( A ){ A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n); } } filter_clause(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } %endif /* SQLITE_OMIT_WINDOWFUNC */ /* ** The code generator needs some extra TK_ token values for tokens that ** are synthesized and do not actually appear in the grammar: */ %token |
︙ | ︙ |