// Initializes a scanNode with a tableName. Returns the table or index name that can be used for // fully-qualified columns if an alias is not specified. func (n *scanNode) initTable(p *planner, tableName *parser.QualifiedName) (string, *roachpb.Error) { if n.desc, n.pErr = p.getTableLease(tableName); n.pErr != nil { return "", n.pErr } if err := p.checkPrivilege(&n.desc, privilege.SELECT); err != nil { return "", roachpb.NewError(err) } alias := n.desc.Name indexName := tableName.Index() if indexName != "" && !equalName(n.desc.PrimaryIndex.Name, indexName) { for i := range n.desc.Indexes { if equalName(n.desc.Indexes[i].Name, indexName) { // Remove all but the matching index from the descriptor. n.desc.Indexes = n.desc.Indexes[i : i+1] n.index = &n.desc.Indexes[0] break } } if n.index == nil { n.pErr = roachpb.NewUErrorf("index \"%s\" not found", indexName) return "", n.pErr } // Use the index name instead of the table name for fully-qualified columns in the // expression. alias = n.index.Name // Strip out any columns from the table that are not present in the // index. visibleCols := make([]ColumnDescriptor, 0, len(n.index.ColumnIDs)+len(n.index.ImplicitColumnIDs)) for _, colID := range n.index.ColumnIDs { col, err := n.desc.FindColumnByID(colID) n.pErr = roachpb.NewError(err) if n.pErr != nil { return "", n.pErr } visibleCols = append(visibleCols, *col) } for _, colID := range n.index.ImplicitColumnIDs { col, err := n.desc.FindColumnByID(colID) n.pErr = roachpb.NewError(err) if n.pErr != nil { return "", n.pErr } visibleCols = append(visibleCols, *col) } n.isSecondaryIndex = true n.initVisibleCols(visibleCols, len(n.index.ImplicitColumnIDs)) } else { n.initDescDefaults() } return alias, nil }