sql<T> function
parts are trusted SQL, values are expressions. Never put user input in parts.
Implementation
Expr<T> sql<T>(List<String> parts, List<Expr<Object?>> values, Codec<T> codec) {
if (parts.length != values.length + 1) {
throw ArgumentError('SQL needs one more text part than expression.');
}
for (final part in parts) {
checkSqlText(part);
}
return Expr.internal(
RawNode(List.of(parts), [for (final v in values) v.expressionNode]),
codec,
);
}