docs: def index_tuple(self,tables_dict,index,is_set):
      "helper for rowget/rowset"
      if not self.aonly_resolved: raise RuntimeError('resolve_aonly() before querying nix')
      with tables_dict.tempkeys():
        tables_dict.update(self.aonly) # todo: find spec support for aliases overwriting existing tables. (more likely, it's an error)
        index = index.name if isinstance(index,sqparse2.NameX) else index
        if isinstance(index,basestring):
          candidates = [t for t in self.table_order if any(f.name==index for f in tables_dict[t].fields)]
          if len(candidates)!=1: raise ColumnNameError(("ambiguous_column" if candidates else "no_such_column"),index)
          tname, = candidates
          return self.table_order.index(tname), tables_dict[tname].lookup(index).index
        elif isinstance(index,sqparse2.AttrX):
          if index.parent.name not in self.aliases: raise TableNameError('table_notin_x',index.parent,self.aliases)
          tname = self.aliases[index.parent.name]
          tindex = self.table_order.index(tname)
          if isinstance(index.attr,sqparse2.AsterX):
            if is_set: raise ValueError('cant_set_asterisk') # todo: better error class
            else: return (tindex,)
          else: return (tindex,tables_dict[tname].lookup(index.attr).index)
          # todo: stronger typing here. make sure both fields of the AttrX are always strings.
        else: raise TypeError(type(index)) # pragma: no cover