render method
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(', ')}''';
}