提交 90b08cd0 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Generate only standard OFFSET / FETCH in Query.appendLimitToSQL()

上级 995ae3c4
...@@ -691,25 +691,22 @@ public abstract class Query extends Prepared { ...@@ -691,25 +691,22 @@ public abstract class Query extends Prepared {
} }
void appendLimitToSQL(StringBuilder buff) { void appendLimitToSQL(StringBuilder buff) {
if (limitExpr != null) {
if (fetchPercent || withTies) {
if (offsetExpr != null) { if (offsetExpr != null) {
buff.append("\nOFFSET ").append(StringUtils.unEnclose(offsetExpr.getSQL())).append(" ROWS"); String count = StringUtils.unEnclose(offsetExpr.getSQL());
buff.append("\nOFFSET ").append(count).append("1".equals(count) ? " ROW" : " ROWS");
} }
buff.append("\nFETCH NEXT ").append(StringUtils.unEnclose(limitExpr.getSQL())); if (limitExpr != null) {
buff.append("\nFETCH ").append(offsetExpr != null ? "NEXT" : "FIRST");
String count = StringUtils.unEnclose(limitExpr.getSQL());
boolean withCount = fetchPercent || !"1".equals(count);
if (withCount) {
buff.append(' ').append(count);
if (fetchPercent) { if (fetchPercent) {
buff.append(" PERCENT"); buff.append(" PERCENT");
} }
buff.append(" ROWS");
if (withTies) {
buff.append(" WITH TIES");
}
} else {
buff.append("\nLIMIT ").append(StringUtils.unEnclose(limitExpr.getSQL()));
if (offsetExpr != null) {
buff.append("\nOFFSET ").append(StringUtils.unEnclose(offsetExpr.getSQL()));
}
} }
buff.append(!withCount ? " ROW" : " ROWS")
.append(withTies ? " WITH TIES" : " ONLY");
} }
} }
......
...@@ -62,7 +62,7 @@ EXPLAIN SELECT DISTINCT TYPE FROM TEST ORDER BY TYPE LIMIT 3; ...@@ -62,7 +62,7 @@ EXPLAIN SELECT DISTINCT TYPE FROM TEST ORDER BY TYPE LIMIT 3;
--> FROM PUBLIC.TEST --> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_TYPE */ --> /* PUBLIC.IDX_TEST_TYPE */
--> ORDER BY 1 --> ORDER BY 1
--> LIMIT 3 --> FETCH FIRST 3 ROWS ONLY
--> /* distinct */ --> /* distinct */
--> /* index sorted */ --> /* index sorted */
; ;
...@@ -144,7 +144,7 @@ FROM (SELECT DISTINCT TYPE FROM TEST) T ORDER BY TYPE; ...@@ -144,7 +144,7 @@ FROM (SELECT DISTINCT TYPE FROM TEST) T ORDER BY TYPE;
--> /* PUBLIC.IDX_TEST_TYPE_VALUE: TYPE = T.TYPE */ --> /* PUBLIC.IDX_TEST_TYPE_VALUE: TYPE = T.TYPE */
--> WHERE T.TYPE = T2.TYPE --> WHERE T.TYPE = T2.TYPE
--> ORDER BY =TYPE, 1 --> ORDER BY =TYPE, 1
--> LIMIT 1 --> FETCH FIRST ROW ONLY
--> /* index sorted */) AS MIN --> /* index sorted */) AS MIN
--> FROM ( --> FROM (
--> SELECT DISTINCT --> SELECT DISTINCT
...@@ -194,7 +194,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE LIMIT 10; ...@@ -194,7 +194,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE LIMIT 10;
--> FROM PUBLIC.TEST --> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_VALUE */ --> /* PUBLIC.IDX_TEST_VALUE */
--> ORDER BY 1 --> ORDER BY 1
--> LIMIT 10 --> FETCH FIRST 10 ROWS ONLY
--> /* index sorted */ --> /* index sorted */
; ;
...@@ -215,7 +215,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE DESC LIMIT 10; ...@@ -215,7 +215,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE DESC LIMIT 10;
--> FROM PUBLIC.TEST --> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_VALUE_D */ --> /* PUBLIC.IDX_TEST_VALUE_D */
--> ORDER BY 1 DESC --> ORDER BY 1 DESC
--> LIMIT 10 --> FETCH FIRST 10 ROWS ONLY
--> /* index sorted */ --> /* index sorted */
; ;
......
...@@ -213,7 +213,7 @@ SELECT * FROM TEST FETCH FIRST 1 ROW WITH TIES; ...@@ -213,7 +213,7 @@ SELECT * FROM TEST FETCH FIRST 1 ROW WITH TIES;
> exception WITH_TIES_WITHOUT_ORDER_BY > exception WITH_TIES_WITHOUT_ORDER_BY
EXPLAIN SELECT * FROM TEST ORDER BY A, B OFFSET 3 ROWS FETCH NEXT 1 ROW WITH TIES; EXPLAIN SELECT * FROM TEST ORDER BY A, B OFFSET 3 ROWS FETCH NEXT 1 ROW WITH TIES;
>> SELECT TEST.A, TEST.B, TEST.C FROM PUBLIC.TEST /* PUBLIC.TEST_A_B_IDX */ ORDER BY 1, 2 OFFSET 3 ROWS FETCH NEXT 1 ROWS WITH TIES /* index sorted */ >> SELECT TEST.A, TEST.B, TEST.C FROM PUBLIC.TEST /* PUBLIC.TEST_A_B_IDX */ ORDER BY 1, 2 OFFSET 3 ROWS FETCH NEXT ROW WITH TIES /* index sorted */
EXPLAIN SELECT * FROM TEST ORDER BY A, B OFFSET 3 ROWS FETCH NEXT 1 PERCENT ROWS WITH TIES; EXPLAIN SELECT * FROM TEST ORDER BY A, B OFFSET 3 ROWS FETCH NEXT 1 PERCENT ROWS WITH TIES;
>> SELECT TEST.A, TEST.B, TEST.C FROM PUBLIC.TEST /* PUBLIC.TEST_A_B_IDX */ ORDER BY 1, 2 OFFSET 3 ROWS FETCH NEXT 1 PERCENT ROWS WITH TIES /* index sorted */ >> SELECT TEST.A, TEST.B, TEST.C FROM PUBLIC.TEST /* PUBLIC.TEST_A_B_IDX */ ORDER BY 1, 2 OFFSET 3 ROWS FETCH NEXT 1 PERCENT ROWS WITH TIES /* index sorted */
......
...@@ -484,8 +484,8 @@ explain insert into test(id) direct sorted select x from system_range(1, 100); ...@@ -484,8 +484,8 @@ explain insert into test(id) direct sorted select x from system_range(1, 100);
>> INSERT INTO PUBLIC.TEST(ID) DIRECT SORTED SELECT X FROM SYSTEM_RANGE(1, 100) /* PUBLIC.RANGE_INDEX */ >> INSERT INTO PUBLIC.TEST(ID) DIRECT SORTED SELECT X FROM SYSTEM_RANGE(1, 100) /* PUBLIC.RANGE_INDEX */
explain select * from test limit 10 sample_size 10; explain select * from test limit 10 sample_size 10;
#+mvStore#>> SELECT TEST.ID FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */ LIMIT 10 SAMPLE_SIZE 10 #+mvStore#>> SELECT TEST.ID FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */ FETCH FIRST 10 ROWS ONLY SAMPLE_SIZE 10
#-mvStore#>> SELECT TEST.ID FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2 */ LIMIT 10 SAMPLE_SIZE 10 #-mvStore#>> SELECT TEST.ID FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2 */ FETCH FIRST 10 ROWS ONLY SAMPLE_SIZE 10
drop table test; drop table test;
> ok > ok
...@@ -4991,7 +4991,7 @@ SELECT LIMIT (1+0) (2+0) NAME, -ID, ID _ID_ FROM TEST ORDER BY _ID_; ...@@ -4991,7 +4991,7 @@ SELECT LIMIT (1+0) (2+0) NAME, -ID, ID _ID_ FROM TEST ORDER BY _ID_;
> rows (ordered): 2 > rows (ordered): 2
EXPLAIN SELECT LIMIT (1+0) (2+0) * FROM TEST ORDER BY ID; EXPLAIN SELECT LIMIT (1+0) (2+0) * FROM TEST ORDER BY ID;
>> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2 */ ORDER BY 1 LIMIT 2 OFFSET 1 /* index sorted */ >> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2 */ ORDER BY 1 OFFSET 1 ROW FETCH NEXT 2 ROWS ONLY /* index sorted */
SELECT * FROM TEST ORDER BY ID LIMIT 2+0 OFFSET 1+0; SELECT * FROM TEST ORDER BY ID LIMIT 2+0 OFFSET 1+0;
> ID NAME > ID NAME
...@@ -5039,7 +5039,7 @@ SELECT * FROM (SELECT ID FROM TEST GROUP BY ID); ...@@ -5039,7 +5039,7 @@ SELECT * FROM (SELECT ID FROM TEST GROUP BY ID);
> rows: 5 > rows: 5
EXPLAIN SELECT * FROM TEST UNION ALL SELECT * FROM TEST ORDER BY ID LIMIT 2+0 OFFSET 1+0; EXPLAIN SELECT * FROM TEST UNION ALL SELECT * FROM TEST ORDER BY ID LIMIT 2+0 OFFSET 1+0;
>> (SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */) UNION ALL (SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */) ORDER BY 1 LIMIT 2 OFFSET 1 >> (SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */) UNION ALL (SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */) ORDER BY 1 OFFSET 1 ROW FETCH NEXT 2 ROWS ONLY
EXPLAIN DELETE FROM TEST WHERE ID=1; EXPLAIN DELETE FROM TEST WHERE ID=1;
>> DELETE FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1 >> DELETE FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1
...@@ -5223,7 +5223,7 @@ EXPLAIN SELECT * FROM TEST WHERE 1=0; ...@@ -5223,7 +5223,7 @@ EXPLAIN SELECT * FROM TEST WHERE 1=0;
>> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan: FALSE */ WHERE FALSE >> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan: FALSE */ WHERE FALSE
EXPLAIN SELECT TOP 1 * FROM TEST FOR UPDATE; EXPLAIN SELECT TOP 1 * FROM TEST FOR UPDATE;
>> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */ LIMIT 1 FOR UPDATE >> SELECT TEST.ID, TEST.NAME FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */ FETCH FIRST ROW ONLY FOR UPDATE
EXPLAIN SELECT COUNT(NAME) FROM TEST WHERE ID=1; EXPLAIN SELECT COUNT(NAME) FROM TEST WHERE ID=1;
>> SELECT COUNT(NAME) FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1 >> SELECT COUNT(NAME) FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论