@Override public String getAlias() { if (column != null) { return column.getName(); } if (tableAlias != null) { return tableAlias + "." + columnName; } return columnName; }
@Override public void mapColumns(ColumnResolver resolver, int level) { if (select == null) select = (Select) resolver.getSelect(); if (resolver instanceof TableFilter && resolver.getTableFilter().getTable().supportsColumnFamily()) { Table t = resolver.getTableFilter().getTable(); // if (!t.isStatic() && t.getRowKeyName().equalsIgnoreCase(columnName)) { // if (columnFamilyName != null) { // schemaName = tableAlias; // tableAlias = columnFamilyName; // columnFamilyName = null; // } // if (tableAlias != null && !database.equalsIdentifiers(tableAlias, // resolver.getTableAlias())) { // return; // } // if (schemaName != null && !database.equalsIdentifiers(schemaName, // resolver.getSchemaName())) { // return; // } // mapColumn(resolver, t.getRowKeyColumn(), level); // return; // } if (database.equalsIdentifiers(Column.ROWKEY, columnName)) { Column col = t.getRowKeyColumn(); if (col != null) { mapColumn(resolver, col, level); return; } } if (resolver.getSelect() == null) { Column c = t.getColumn(columnName); mapColumn(resolver, c, level); return; } String tableAlias = this.tableAlias; boolean useAlias = false; // 当columnFamilyName不存在时,有可能是想使用简化的tableAlias.columnName语法 if (columnFamilyName != null && !t.doesColumnFamilyExist(columnFamilyName)) { // 不替换原有的tableAlias,因为有可能在另一个table中存在这样的columnFamilyName tableAlias = columnFamilyName; if (!t.doesColumnExist(columnName)) return; useAlias = true; } if (tableAlias != null && !database.equalsIdentifiers(tableAlias, resolver.getTableAlias())) { return; } if (schemaName != null && !database.equalsIdentifiers(schemaName, resolver.getSchemaName())) { return; } String fullColumnName; if (useAlias || columnFamilyName == null) fullColumnName = columnName; else fullColumnName = t.getFullColumnName(columnFamilyName, columnName); if (t.doesColumnExist(fullColumnName)) { Column c = t.getColumn(fullColumnName); mapColumn(resolver, c, level); return; } } else { if (columnFamilyName != null) { schemaName = tableAlias; tableAlias = columnFamilyName; columnFamilyName = null; } } if (tableAlias != null && !database.equalsIdentifiers(tableAlias, resolver.getTableAlias())) { return; } if (schemaName != null && !database.equalsIdentifiers(schemaName, resolver.getSchemaName())) { return; } for (Column col : resolver.getColumns()) { String n = col.getName(); if (database.equalsIdentifiers(columnName, n)) { mapColumn(resolver, col, level); return; } } if (database.equalsIdentifiers(Column.ROWID, columnName)) { Column col = resolver.getRowIdColumn(); if (col != null) { mapColumn(resolver, col, level); return; } } Column[] columns = resolver.getSystemColumns(); for (int i = 0; columns != null && i < columns.length; i++) { Column col = columns[i]; if (database.equalsIdentifiers(columnName, col.getName())) { mapColumn(resolver, col, level); return; } } }
@Override public String getColumnName() { return columnName != null ? columnName : column.getName(); }
@Override public int update() { if (!transactional) { session.commit(true); } Database db = session.getDatabase(); if (!db.isPersistent()) { data.persistIndexes = false; } if (getSchema().findTableOrView(session, data.tableName) != null) { if (ifNotExists) { return 0; } throw DbException.get(ErrorCode.TABLE_OR_VIEW_ALREADY_EXISTS_1, data.tableName); } if (asQuery != null) { asQuery.prepare(); if (data.columns.isEmpty()) { generateColumnsFromQuery(); } else if (data.columns.size() != asQuery.getColumnCount()) { throw DbException.get(ErrorCode.COLUMN_COUNT_DOES_NOT_MATCH); } } if (pkColumns != null) { for (Column c : data.columns) { for (IndexColumn idxCol : pkColumns) { if (c.getName().equals(idxCol.columnName)) { c.setNullable(false); } } } } data.id = getObjectId(); data.create = create; data.session = session; boolean isSessionTemporary = data.temporary && !data.globalTemporary; if (!isSessionTemporary) { db.lockMeta(session); } Table table = createTable(data); ArrayList<Sequence> sequences = New.arrayList(); for (Column c : data.columns) { if (c.isAutoIncrement()) { int objId = getObjectId(); c.convertAutoIncrementToSequence(session, getSchema(), objId, data.temporary); } Sequence seq = c.getSequence(); if (seq != null) { sequences.add(seq); } } table.setComment(comment); if (isSessionTemporary) { if (onCommitDrop) { table.setOnCommitDrop(true); } if (onCommitTruncate) { table.setOnCommitTruncate(true); } session.addLocalTempTable(table); } else { db.lockMeta(session); db.addSchemaObject(session, table); } try { for (Column c : data.columns) { c.prepareExpression(session); } for (Sequence sequence : sequences) { table.addSequence(sequence); } for (DefineCommand command : constraintCommands) { command.setTransactional(transactional); command.update(); } if (asQuery != null) { Insert insert = null; insert = new Insert(session); insert.setSortedInsertMode(sortedInsertMode); insert.setQuery(asQuery); insert.setTable(table); insert.setInsertFromSelect(true); insert.prepare(); insert.update(); } } catch (DbException e) { db.checkPowerOff(); db.removeSchemaObject(session, table); if (!transactional) { session.commit(true); } throw e; } return 0; }