// CreateTable creates a table. // Privileges: CREATE on database. // Notes: postgres/mysql require CREATE on database. func (p *planner) CreateTable(n *parser.CreateTable) (planNode, *roachpb.Error) { if err := n.Table.NormalizeTableName(p.session.Database); err != nil { return nil, roachpb.NewError(err) } dbDesc, pErr := p.getDatabaseDesc(n.Table.Database()) if pErr != nil { return nil, pErr } if err := p.checkPrivilege(dbDesc, privilege.CREATE); err != nil { return nil, roachpb.NewError(err) } desc, err := makeTableDesc(n, dbDesc.ID) if err != nil { return nil, roachpb.NewError(err) } // Inherit permissions from the database descriptor. desc.Privileges = dbDesc.GetPrivileges() if len(desc.PrimaryIndex.ColumnNames) == 0 { // Ensure a Primary Key exists. s := "unique_rowid()" col := ColumnDescriptor{ Name: "rowid", Type: ColumnType{ Kind: ColumnType_INT, }, DefaultExpr: &s, Hidden: true, Nullable: false, } desc.AddColumn(col) idx := IndexDescriptor{ Unique: true, ColumnNames: []string{col.Name}, ColumnDirections: []IndexDescriptor_Direction{IndexDescriptor_ASC}, } if err := desc.AddIndex(idx, true); err != nil { return nil, roachpb.NewError(err) } } if err := desc.AllocateIDs(); err != nil { return nil, roachpb.NewError(err) } created, pErr := p.createDescriptor(tableKey{dbDesc.ID, n.Table.Table()}, &desc, n.IfNotExists) if pErr != nil { return nil, pErr } if created { // Log Create Table event. if pErr := MakeEventLogger(p.leaseMgr).InsertEventRecord(p.txn, EventLogCreateTable, int32(desc.ID), int32(p.evalCtx.NodeID), struct { TableName string Statement string User string }{n.Table.String(), n.String(), p.session.User}, ); pErr != nil { return nil, pErr } } return &emptyNode{}, nil }