mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-11-25 13:37:47 +01:00
sqldb+invoices: fix ordering bug in FilterInvoices
Previously if the `reverse` named arg was unset (value of NULL), then
SQL would order by NULL instead of ID causing undifined ordering of the
returned rows. To fix that we check for NULL and also make sure to set
the `reverse` arg in the code explicitly as it in the generated code it
is an `interface{}` instead of `bool`.
This commit is contained in:
@@ -624,6 +624,7 @@ func (i *SQLStore) FetchPendingInvoices(ctx context.Context) (
|
|||||||
PendingOnly: true,
|
PendingOnly: true,
|
||||||
NumOffset: int32(offset),
|
NumOffset: int32(offset),
|
||||||
NumLimit: int32(limit),
|
NumLimit: int32(limit),
|
||||||
|
Reverse: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
rows, err := db.FilterInvoices(ctx, params)
|
rows, err := db.FilterInvoices(ctx, params)
|
||||||
@@ -683,6 +684,7 @@ func (i *SQLStore) InvoicesSettledSince(ctx context.Context, idx uint64) (
|
|||||||
SettleIndexGet: sqldb.SQLInt64(settleIdx + 1),
|
SettleIndexGet: sqldb.SQLInt64(settleIdx + 1),
|
||||||
NumLimit: int32(limit),
|
NumLimit: int32(limit),
|
||||||
NumOffset: int32(offset),
|
NumOffset: int32(offset),
|
||||||
|
Reverse: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
rows, err := db.FilterInvoices(ctx, params)
|
rows, err := db.FilterInvoices(ctx, params)
|
||||||
@@ -798,6 +800,7 @@ func (i *SQLStore) InvoicesAddedSince(ctx context.Context, idx uint64) (
|
|||||||
AddIndexGet: sqldb.SQLInt64(addIdx + 1),
|
AddIndexGet: sqldb.SQLInt64(addIdx + 1),
|
||||||
NumLimit: int32(limit),
|
NumLimit: int32(limit),
|
||||||
NumOffset: int32(offset),
|
NumOffset: int32(offset),
|
||||||
|
Reverse: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
rows, err := db.FilterInvoices(ctx, params)
|
rows, err := db.FilterInvoices(ctx, params)
|
||||||
@@ -857,14 +860,6 @@ func (i *SQLStore) QueryInvoices(ctx context.Context,
|
|||||||
PendingOnly: q.PendingOnly,
|
PendingOnly: q.PendingOnly,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !q.Reversed {
|
|
||||||
// The invoice with index offset id must not be
|
|
||||||
// included in the results.
|
|
||||||
params.AddIndexGet = sqldb.SQLInt64(
|
|
||||||
q.IndexOffset + uint64(offset) + 1,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if q.Reversed {
|
if q.Reversed {
|
||||||
idx := int32(q.IndexOffset)
|
idx := int32(q.IndexOffset)
|
||||||
|
|
||||||
@@ -883,6 +878,14 @@ func (i *SQLStore) QueryInvoices(ctx context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
params.Reverse = true
|
params.Reverse = true
|
||||||
|
} else {
|
||||||
|
// The invoice with index offset id must not be
|
||||||
|
// included in the results.
|
||||||
|
params.AddIndexGet = sqldb.SQLInt64(
|
||||||
|
q.IndexOffset + uint64(offset) + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
params.Reverse = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if q.CreationDateStart != 0 {
|
if q.CreationDateStart != 0 {
|
||||||
|
|||||||
@@ -82,19 +82,19 @@ WHERE (
|
|||||||
$7 IS NULL
|
$7 IS NULL
|
||||||
) AND (
|
) AND (
|
||||||
CASE
|
CASE
|
||||||
WHEN $8=TRUE THEN (state = 0 OR state = 3)
|
WHEN $8 = TRUE THEN (state = 0 OR state = 3)
|
||||||
ELSE TRUE
|
ELSE TRUE
|
||||||
END
|
END
|
||||||
)
|
)
|
||||||
ORDER BY
|
ORDER BY
|
||||||
CASE
|
CASE
|
||||||
WHEN $9 = FALSE THEN id
|
WHEN $9 = FALSE OR $9 IS NULL THEN id
|
||||||
ELSE NULL
|
ELSE NULL
|
||||||
END ASC,
|
END ASC,
|
||||||
CASE
|
CASE
|
||||||
WHEN $9 = TRUE THEN id
|
WHEN $9 = TRUE THEN id
|
||||||
ELSE NULL
|
ELSE NULL
|
||||||
END DESC
|
END DESC
|
||||||
LIMIT $11 OFFSET $10
|
LIMIT $11 OFFSET $10
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@@ -73,19 +73,19 @@ WHERE (
|
|||||||
sqlc.narg('created_before') IS NULL
|
sqlc.narg('created_before') IS NULL
|
||||||
) AND (
|
) AND (
|
||||||
CASE
|
CASE
|
||||||
WHEN sqlc.narg('pending_only')=TRUE THEN (state = 0 OR state = 3)
|
WHEN sqlc.narg('pending_only') = TRUE THEN (state = 0 OR state = 3)
|
||||||
ELSE TRUE
|
ELSE TRUE
|
||||||
END
|
END
|
||||||
)
|
)
|
||||||
ORDER BY
|
ORDER BY
|
||||||
CASE
|
CASE
|
||||||
WHEN sqlc.narg('reverse') = FALSE THEN id
|
WHEN sqlc.narg('reverse') = FALSE OR sqlc.narg('reverse') IS NULL THEN id
|
||||||
ELSE NULL
|
ELSE NULL
|
||||||
END ASC,
|
END ASC,
|
||||||
CASE
|
CASE
|
||||||
WHEN sqlc.narg('reverse') = TRUE THEN id
|
WHEN sqlc.narg('reverse') = TRUE THEN id
|
||||||
ELSE NULL
|
ELSE NULL
|
||||||
END DESC
|
END DESC
|
||||||
LIMIT @num_limit OFFSET @num_offset;
|
LIMIT @num_limit OFFSET @num_offset;
|
||||||
|
|
||||||
-- name: UpdateInvoiceState :execresult
|
-- name: UpdateInvoiceState :execresult
|
||||||
|
|||||||
Reference in New Issue
Block a user