Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Small optimizations to the grammar for window functions save about 120 bytes of space in the parser tables. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
bce01d9584e52b23d7c07c2e832d5fa5 |
User & Date: | drh 2019-04-02 18:12:20.162 |
Context
2019-04-03
| ||
16:27 | Fix a couple of problems with "RANGE BETWEEN <expr> PRECEDING AND <expr> PRECEDING" frames. (check-in: 39225cc775 user: dan tags: trunk) | |
2019-04-02
| ||
18:12 | Small optimizations to the grammar for window functions save about 120 bytes of space in the parser tables. (check-in: bce01d9584 user: drh tags: trunk) | |
17:45 | Use a separate bit on db->dbOptFlags to disable the xInverse optimization on window functions, rather than reusing the query-flattener disable bit. (check-in: bc0fb1c324 user: drh tags: trunk) | |
Changes
Changes to src/parse.y.
︙ | ︙ | |||
1690 1691 1692 1693 1694 1695 1696 | frame_opt(A) ::= . { A = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y) frame_exclude_opt(Z). { A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0, Z); } | | > | < < < | | | | | | | | | | | | < | 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 | frame_opt(A) ::= . { A = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y) frame_exclude_opt(Z). { A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0, Z); } frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND frame_bound_e(Z) frame_exclude_opt(W). { A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr, W); } range_or_rows(A) ::= RANGE|ROWS|GROUPS(X). {A = @X; /*A-overwrites-X*/} frame_bound_s(A) ::= frame_bound(X). {A = X;} frame_bound_s(A) ::= UNBOUNDED(X) PRECEDING. {A.eType = @X; A.pExpr = 0;} frame_bound_e(A) ::= frame_bound(X). {A = X;} frame_bound_e(A) ::= UNBOUNDED(X) FOLLOWING. {A.eType = @X; A.pExpr = 0;} frame_bound(A) ::= expr(X) PRECEDING|FOLLOWING(Y). {A.eType = @Y; A.pExpr = X;} frame_bound(A) ::= CURRENT(X) ROW. {A.eType = @X; A.pExpr = 0;} %type frame_exclude_opt {u8} frame_exclude_opt(A) ::= . {A = 0;} frame_exclude_opt(A) ::= EXCLUDE frame_exclude(X). {A = X;} %type frame_exclude {u8} frame_exclude(A) ::= NO(X) OTHERS. {A = @X; /*A-overwrites-X*/} frame_exclude(A) ::= CURRENT(X) ROW. {A = @X; /*A-overwrites-X*/} 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; } %type over_clause {Window*} |
︙ | ︙ |