提交 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 {
}
void appendLimitToSQL(StringBuilder buff) {
if (offsetExpr != null) {
String count = StringUtils.unEnclose(offsetExpr.getSQL());
buff.append("\nOFFSET ").append(count).append("1".equals(count) ? " ROW" : " ROWS");
}
if (limitExpr != null) {
if (fetchPercent || withTies) {
if (offsetExpr != null) {
buff.append("\nOFFSET ").append(StringUtils.unEnclose(offsetExpr.getSQL())).append(" ROWS");
}
buff.append("\nFETCH NEXT ").append(StringUtils.unEnclose(limitExpr.getSQL()));
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) {
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;
--> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_TYPE */
--> ORDER BY 1
--> LIMIT 3
--> FETCH FIRST 3 ROWS ONLY
--> /* distinct */
--> /* index sorted */
;
......@@ -144,7 +144,7 @@ FROM (SELECT DISTINCT TYPE FROM TEST) T ORDER BY TYPE;
--> /* PUBLIC.IDX_TEST_TYPE_VALUE: TYPE = T.TYPE */
--> WHERE T.TYPE = T2.TYPE
--> ORDER BY =TYPE, 1
--> LIMIT 1
--> FETCH FIRST ROW ONLY
--> /* index sorted */) AS MIN
--> FROM (
--> SELECT DISTINCT
......@@ -194,7 +194,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE LIMIT 10;
--> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_VALUE */
--> ORDER BY 1
--> LIMIT 10
--> FETCH FIRST 10 ROWS ONLY
--> /* index sorted */
;
......@@ -215,7 +215,7 @@ EXPLAIN SELECT VALUE FROM TEST ORDER BY VALUE DESC LIMIT 10;
--> FROM PUBLIC.TEST
--> /* PUBLIC.IDX_TEST_VALUE_D */
--> ORDER BY 1 DESC
--> LIMIT 10
--> FETCH FIRST 10 ROWS ONLY
--> /* index sorted */
;
......
......@@ -213,7 +213,7 @@ SELECT * FROM TEST FETCH FIRST 1 ROW WITH TIES;
> exception WITH_TIES_WITHOUT_ORDER_BY
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;
>> 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);
>> 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;
#+mvStore#>> SELECT TEST.ID FROM PUBLIC.TEST /* PUBLIC.TEST.tableScan */ LIMIT 10 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.TEST.tableScan */ FETCH FIRST 10 ROWS ONLY 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;
> ok
......@@ -4991,7 +4991,7 @@ SELECT LIMIT (1+0) (2+0) NAME, -ID, ID _ID_ FROM TEST ORDER BY _ID_;
> rows (ordered): 2
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;
> ID NAME
......@@ -5039,7 +5039,7 @@ SELECT * FROM (SELECT ID FROM TEST GROUP BY ID);
> rows: 5
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;
>> DELETE FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1
......@@ -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
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;
>> SELECT COUNT(NAME) FROM PUBLIC.TEST /* PUBLIC.PRIMARY_KEY_2: ID = 1 */ WHERE ID = 1
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论