Result getResult ( Session session ) { Table table = baseTable ; Result resultOut = null ; RowSetNavigator generatedNavigator = null ; PersistentStore store = session . sessionData . getRowStore ( baseTable ) ; if ( generatedIndexes != null ) { resultOut = Result . newUpdateCountResult ( generatedResultMetaData , 0 ) ; generatedNavigator = resultOut . getChainedResult ( ) . getNavigator ( ) ; } RowSetNavigator newDataNavigator = queryExpression == null ? getInsertValuesNavigator ( session ) : getInsertSelectNavigator ( session ) ; Expression checkCondition = null ; RangeIteratorBase checkIterator = null ; if ( targetTable != baseTable ) { QuerySpecification select = ( ( TableDerived ) targetTable ) . getQueryExpression ( ) . getMainSelect ( ) ; checkCondition = select . checkQueryCondition ; if ( checkCondition != null ) { checkIterator = select . rangeVariables [ 0 ] . getIterator ( session ) ; } } while ( newDataNavigator . hasNext ( ) ) { Object [ ] data = newDataNavigator . getNext ( ) ; if ( checkCondition != null ) { checkIterator . currentData = data ; boolean check = checkCondition . testCondition ( session ) ; if ( ! check ) { throw Error . error ( ErrorCode . X_44000 ) ; } } table . insertRow ( session , store , data ) ; if ( generatedNavigator != null ) { Object [ ] generatedValues = getGeneratedColumns ( data ) ; generatedNavigator . add ( generatedValues ) ; } } newDataNavigator . beforeFirst ( ) ; table . fireAfterTriggers ( session , Trigger . INSERT_AFTER , newDataNavigator ) ; if ( resultOut == null ) { resultOut = Result . getUpdateCountResult ( newDataNavigator . getSize ( ) ) ; } else { resultOut . setUpdateCount ( newDataNavigator . getSize ( ) ) ; } return resultOut ; }
Executes an INSERT_SELECT statement . It is assumed that the argument is of the correct type .