docs: public final void lookupNameCompletionHints(
  		SqlValidatorScope scope,
  		List<String> names,
  		SqlParserPos pos,
  		Collection<SqlMoniker> hintList) {
  		// Remove the last part of name - it is a dummy
  		List<String> subNames = Util.skipLast(names);
  
  		if (subNames.size() > 0) {
  			// If there's a prefix, resolve it to a namespace.
  			SqlValidatorNamespace ns = null;
  			for (String name : subNames) {
  				if (ns == null) {
  					final SqlValidatorScope.ResolvedImpl resolved =
  						new SqlValidatorScope.ResolvedImpl();
  					final SqlNameMatcher nameMatcher = catalogReader.nameMatcher();
  					scope.resolve(ImmutableList.of(name), nameMatcher, false, resolved);
  					if (resolved.count() == 1) {
  						ns = resolved.only().namespace;
  					}
  				} else {
  					ns = ns.lookupChild(name);
  				}
  				if (ns == null) {
  					break;
  				}
  			}
  			if (ns != null) {
  				RelDataType rowType = ns.getRowType();
  				if (rowType.isStruct()) {
  					for (RelDataTypeField field : rowType.getFieldList()) {
  						hintList.add(
  							new SqlMonikerImpl(
  								field.getName(),
  								SqlMonikerType.COLUMN));
  					}
  				}
  			}
  
  			// builtin function names are valid completion hints when the
  			// identifier has only 1 name part
  			findAllValidFunctionNames(names, this, hintList, pos);
  		} else {
  			// No prefix; use the children of the current scope (that is,
  			// the aliases in the FROM clause)
  			scope.findAliases(hintList);
  
  			// If there's only one alias, add all child columns
  			SelectScope selectScope =
  				SqlValidatorUtil.getEnclosingSelectScope(scope);
  			if ((selectScope != null)
  				&& (selectScope.getChildren().size() == 1)) {
  				RelDataType rowType =
  					selectScope.getChildren().get(0).getRowType();
  				for (RelDataTypeField field : rowType.getFieldList()) {
  					hintList.add(
  						new SqlMonikerImpl(
  							field.getName(),
  							SqlMonikerType.COLUMN));
  				}
  			}
  		}
  
  		findAllValidUdfNames(names, this, hintList);
  	}