expandParameters method

List<Typeable> expandParameters()

Returns the expanded parameters of a function call.

When a StarFunctionParameter is used, it's expanded to the ReferenceScope.expansionOfStarColumn. Elements of the result are either an Expression or a Column.

Implementation

List<Typeable> expandParameters() {
  final sqlParameters = parameters;

  if (sqlParameters is ExprFunctionParameters) {
    return sqlParameters.parameters;
  } else if (sqlParameters is StarFunctionParameter) {
    // if * is used as a parameter, it refers to all columns in all tables
    // that are available in the current scope.
    final allColumns = scope.expansionOfStarColumn;
    if (allColumns == null) return const [];

    // When we look at `SELECT SUM(*), foo FROM ...`, the star in `SUM`
    // shouldn't expand to include itself.
    final unrelated = allColumns.where((column) {
      if (column is! ExpressionColumn) return true;

      final expression = column.expression;
      return !expression.selfAndDescendants.contains(this);
    });

    return unrelated.toList();
  }

  throw ArgumentError('Unknown parameters: $sqlParameters');
}