compile method

SqlCommand compile(
  1. Capabilities capabilities
)

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;
}