Adding LIMIT clause to query results in assertion failure
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 42/100
調査の方向性
SqlMapping.scala:1717 から始め、子の Limit を適用した状態で、提示された Scala クエリを再現します。addFilterOrderByOffsetLimit と、join による既存の ORDER BY が Limit とどのように相互作用するかを調査します。クエリが assertion をトリガーしなくなり、要求された Limit を維持した有効な SQL を生成すれば完了です。
索引モデルが issue の本文から書いたものです。
説明
The following query
Select(
"programs",
Nil,
Filter(
And(
Or(
Contains(ListPath(List("users", "userId")), Const("u-107")),
Eql(UniquePath(List("piUserId")), Const("u-107"))
),
Eql(UniquePath(List("existence")), Const(Present))
),
Group(
List(
Select("id", List(), Empty),
Select("name", List(), Empty)
)
)
)
)
produces the following SQL.
SELECT
t_program.c_name,
t_program.c_program_id
FROM
t_program
INNER JOIN (
SELECT
DISTINCT ON ((t_program.c_program_id COLLATE "C"))(t_program.c_program_id COLLATE "C")
FROM
t_program
LEFT JOIN t_program_user ON (
t_program_user.c_program_id = t_program.c_program_id
)
WHERE
(
(
(
(t_program_user.c_user_id = $1)
OR (t_program.c_pi_user_id = $2)
)
AND (t_program.c_existence = $3)
)
)
AND (t_program.c_program_id IS NOT NULL)
ORDER BY
(t_program.c_program_id COLLATE "C") NULLS LAST
) AS t_program_pred ON (
t_program_pred.c_program_id = t_program.c_program_id
)
Adding a Limit to the child query, thus
Select(
"programs",
Nil,
Filter(
And(
Or(
Contains(ListPath(List("users", "userId")), Const("u-107")),
Eql(UniquePath(List("piUserId")), Const("u-107"))
),
Eql(UniquePath(List("existence")), Const(Present))
),
Limit(
1000,
Group(
List(
Select("id", Nil, Empty),
Select("name", Nil, Empty)
)
)
)
)
)
results in
java.lang.AssertionError: assertion failed
at scala.Predef$.assert(Predef.scala:264)
at edu.gemini.grackle.sql.SqlMapping$SqlQuery$SqlSelect.addFilterOrderByOffsetLimit(SqlMapping.scala:1717)
...
due to (I assume) the already-present ORDER BY caused by the joins ... ?
assert(orders.isEmpty && offset.isEmpty && limit.isEmpty && !isDistinct)
Relevant [abbreviated] definitions:
create table t_user (
c_user_id d_user_id primary key not null,
...
);
create table t_program (
c_program_id d_program_id not null primary key,
c_existence e_existence not null,
c_pi_user_id d_user_id,
c_name text,
...
);
create table t_program_user (
c_program_id d_program_id not null,
c_user_id d_user_id not null,
...
);
object Program extends TableDef("t_program") {
val Id = col("c_program_id", program_id)
val PiUserId = col("c_pi_user_id", user_id)
val Existence = col("c_existence", existence)
val Name = col("c_name", text_nonempty.opt)
}
object ProgramUser extends TableDef("t_program_user") {
val ProgramId = col("c_program_id", program_id)
val UserId = col("c_user_id", user_id)
val Role = col("c_role", program_user_role)
}
object User extends TableDef("t_user") {
val Id = col("c_user_id", user_id)
}
ObjectMapping(
tpe = QueryType,
fieldMappings = List(
SqlRoot("programs"),
SqlRoot("program"),
)
),
ObjectMapping(
tpe = ProgramType,
fieldMappings = List(
SqlField("id", Program.Id, key = true),
SqlField("existence", Program.Existence, hidden = true),
SqlField("name", Program.Name),
SqlField("piUserId", Program.PiUserId, hidden = true),
SqlObject("pi", Join(Program.PiUserId, User.Id)),
SqlObject("users", Join(Program.Id, ProgramUser.ProgramId)),
),
),
ObjectMapping(
tpe = ProgramUserType,
fieldMappings = List(
SqlField("programId", ProgramUser.ProgramId, hidden = true, key = true),
SqlField("userId", ProgramUser.UserId, key = true),
SqlField("role", ProgramUser.Role),
SqlObject("user", Join(ProgramUser.UserId, User.Id))
),
),
LeafMapping[lucuma.core.model.User.Id](UserIdType),
LeafMapping[lucuma.core.model.Program.Id](ProgramIdType),
LeafMapping[ProgramUserRole](ProgramUserRoleType),
- 主要言語
- Scala
- スター
- 189
- フォーク
- 32
- 平均マージ
- 14時間 48分
- マージ済み PR(30日)
- 25
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
typelevel/grackle のほかの issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
-
Add http(4s) moduleオープン
難易度 5/5 1週間以上 初心者へのやさしさ 28/100
typelevel/grackle#946 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
conformance
難易度 3/5 1〜2日 初心者へのやさしさ 48/100
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
メンテナーはふだん 1 日以内に返信
typelevel/grackle の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
メンテナーはふだん 1 日以内に返信
-
arrays_zip with two same-named inputs fails with "ArrowArray struct has 2 children (expected 1)"オープンbug requires-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
apache/datafusion-comet#6251 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
ergoplatform/ergo#2579 ·
メンテナーはふだん 2 日以内に返信
-
x:action/improve x:size/tiny x:type/content
難易度 1/5 1〜3時間 初心者へのやさしさ 88/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
typelevel/sbt-typelevel#929 ·