code: public void insert() {
  		// Block read-only transaction
  		if (tx.isReadOnly() && !isTempTable())
  			throw new UnsupportedOperationException();
  
  		// Insertion may change the properties of this file,
  		// so that we need to lock the file.
  		if (!isTempTable())
  			tx.concurrencyMgr().modifyFile(fileName);
  
  		// Modify the free chain which is start from a pointer in
  		// the header of the file.
  		if (fhp == null)
  			fhp = openHeaderForModification();
  
  		// Log that this logical operation starts
  		tx.recoveryMgr().logLogicalStart();
  
  		if (fhp.hasDeletedSlots()) {
  			// Insert into a deleted slot
  			moveToRecordId(fhp.getLastDeletedSlot());
  			RecordId lds = rp.insertIntoDeletedSlot();
  			fhp.setLastDeletedSlot(lds);
  		} else {
  			// Insert into a empty slot
  			if (!fhp.hasDataRecords()) { // no record inserted before
  				// Create the first data block
  				appendBlock();
  				moveTo(1);
  				rp.insertIntoNextEmptySlot();
  			} else {
  				// Find the tail page
  				RecordId tailSlot = fhp.getTailSolt();
  				moveToRecordId(tailSlot);
  				while (!rp.insertIntoNextEmptySlot()) {
  					if (atLastBlock())
  						appendBlock();
  					moveTo(currentBlkNum + 1);
  				}
  			}
  			fhp.setTailSolt(currentRecordId());
  		}
  
  		// Log that this logical operation ends
  		RecordId insertedRid = currentRecordId();
  		tx.recoveryMgr().logRecordFileInsertionEnd(ti.tableName(), insertedRid.block().number(), insertedRid.id());
  
  		// Close the header (release the header lock)
  		closeHeader();
  	}
docs: Inserts a new, blank record somewhere in the file beginning at the
  current record. If the new record does not fit into an existing block,
  then a new block is appended to the file.