private RelOptTableImpl getTableFrom(List<String> names, List<String> schemaNames) {
   OptiqSchema schema = getSchema(Iterables.concat(schemaNames, Util.skipLast(names)));
   if (schema == null) {
     return null;
   }
   final String name = Util.last(names);
   Pair<String, Table> pair = schema.getTable(name, caseSensitive);
   if (pair == null) {
     pair = schema.getTableBasedOnNullaryFunction(name, caseSensitive);
   }
   if (pair != null) {
     final Table table = pair.getValue();
     final String name2 = pair.getKey();
     return RelOptTableImpl.create(this, table.getRowType(typeFactory), schema.add(name2, table));
   }
   return null;
 }
 private Collection<Function> getFunctionsFrom(List<String> names) {
   final List<Function> functions2 = Lists.newArrayList();
   final List<? extends List<String>> schemaNameList;
   if (names.size() > 1) {
     // If name is qualified, ignore path.
     schemaNameList = ImmutableList.of(ImmutableList.<String>of());
   } else {
     OptiqSchema schema = getSchema(defaultSchema);
     if (schema == null) {
       schemaNameList = ImmutableList.of();
     } else {
       schemaNameList = schema.getPath();
     }
   }
   for (List<String> schemaNames : schemaNameList) {
     OptiqSchema schema = getSchema(Iterables.concat(schemaNames, Util.skipLast(names)));
     if (schema != null) {
       final String name = Util.last(names);
       functions2.addAll(schema.getFunctions(name, true));
     }
   }
   return functions2;
 }