compile method
Compiles once for the current capabilities without acquiring a connection. Accepts one trailing semicolon. Parameter limits use actual protocol slots.
Implementation
SqlCommand compile(Capabilities capabilities) {
final writer = SqlWriter(
capabilities.dialect,
{},
exactDecimal: capabilities.exactDecimal,
temporal: capabilities.temporal,
);
final source = _SqlSource(writer);
_append(source);
final parsed = scanSql(source.text.toString(), capabilities.dialect);
final slots = <String, String>{};
final text = parsed.parts.map((part) {
if (part is String) return part;
final name = (part as SqlSlot).name;
return slots.putIfAbsent(name, () {
final value = source.parameters[name];
if (value is SqlValue<Object?>) {
SqlNode node = ParameterNode(value._encoded, sqlType: value._storage);
if (value._storage == 'decimal') node = DecimalNode(node);
if ({
'date',
'time',
'local_datetime',
'instant',
}.contains(value._storage)) {
node = TemporalNode(node, value._storage);
}
return node.write(writer);
}
return writer.parameter(value);
});
}).join();
final command = writer.finish(text);
if (command.parameters.length > capabilities.maxParameters) {
throw const OrmException(
'QUERY.PARAMETERS',
'SQL exceeds the parameter limit.',
);
}
return command;
}