resolveUnqualifiedReference method

  1. @override
List<Column> resolveUnqualifiedReference(
  1. String columnName, {
  2. bool allowReferenceToResultColumn = false,
})
override

Attempts to resolve an unqualified reference from a columnName.

In sqlite, an ORDER BY column may refer to aliases of result columns in the current statement: SELECT foo AS bar FROM tbl ORDER BY bar is legal, but SELECT foo AS bar FROM tbl WHERE bar < 10 is not. To control whether result columns may be resolved, the allowReferenceToResultColumn flag can be enabled.

If an empty list is returned, the reference couldn't be resolved. If the returned list contains more than one column, the lookup is ambigious.

Implementation

@override
List<Column> resolveUnqualifiedReference(String columnName,
    {bool allowReferenceToResultColumn = false}) {
  if (allowReferenceToResultColumn) {
    final foundColumn = namedResultColumns.firstWhereOrNull(
        (c) => c.name.toLowerCase() == columnName.toLowerCase());
    if (foundColumn != null) {
      return [foundColumn];
    }
  }

  final available = resultSets.values;
  final sourceColumns = <Column>{};
  final availableColumns = <AvailableColumn>[];

  for (final availableSource in available) {
    final resolvedColumns =
        availableSource.resultSet.resultSet?.resolvedColumns;
    if (resolvedColumns == null ||
        !availableSource.canUseUnqualifiedColumns) {
      continue;
    }

    for (final column in resolvedColumns) {
      if (column.name.toLowerCase() == columnName.toLowerCase() &&
          sourceColumns.add(column)) {
        availableColumns.add(AvailableColumn(column, availableSource));
      }
    }
  }

  if (availableColumns.isEmpty) {
    return parent.resolveUnqualifiedReference(columnName);
  } else {
    return availableColumns;
  }
}