render method

  1. @override
String render(
  1. RenderContext context
)
override

Renders this clause to SQL text, recording any bind values on context.

context is the entire context a clause is given: use RenderContext.escapeName for identifiers and RenderContext.param for values.

Return an empty string to render nothing, which is how an optional clause (such as a WHERE with no filter) drops itself from the statement.

Implementation

@override
String render(RenderContext context) {
  final encoded = rows.map(into.values).toList();

  final sqlColumns = <String>[];
  final included = <int>[];
  for (var i = 0; i < into.columns.length; i++) {
    final column = into.columns[i];
    if (column.isPrimaryKey || column.defaultValue != null) {
      final hasValue = encoded.any((vals) => vals[i] != null);
      if (!hasValue) continue;
    }
    sqlColumns.add(context.escapeName(column.name));
    included.add(i);
  }

  final tuples = <String>[];
  for (final row in encoded) {
    final placeholders = [for (final i in included) context.param(row[i])];
    tuples.add('(${placeholders.join(', ')})');
  }

  return '''
INTO ${TableClause(into).render(context)} (${sqlColumns.join(', ')}) VALUES ${tuples.join(', ')}''';
}