Adding LIMIT clause to query results in assertion failure
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 42/100
Direzione di ricerca
Parti da SqlMapping.scala:1717 e riproduci la query Scala fornita con il Limit figlio applicato. Ispeziona addFilterOrderByOffsetLimit e il modo in cui l'ORDER BY esistente dei join interagisce con il limite. Il lavoro è completato quando la query non attiva più l'assertion e produce SQL valido mantenendo il limite richiesto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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),
- Lingua principale
- Scala
- Stelle
- 189
- Fork
- 32
- Merge medio
- 14h 48m
- PR unite (30g)
- 25
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di typelevel/grackle
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Add http(4s) moduleAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 28/100
typelevel/grackle#946 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
conformance
Difficoltà 3/5 1-2 giorni Idoneità per principianti 48/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Postgres enum supportApertaenhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di typelevel/grackle
Issue simili
-
Files.createDirectories throws a bare IOException when another process creates the directory firstAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
scala-native/scala-native#5077 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
arrays_zip with two same-named inputs fails with "ArrowArray struct has 2 children (expected 1)"Apertabug requires-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/datafusion-comet#6251 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
ergoplatform/ergo#2579 ·
I maintainer di solito rispondono entro 2 giorni
-
x:action/improve x:size/tiny x:type/content
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno