Package org.apache.derby.iapi.sql.dictionary

Examples of org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor


                      OptimizablePredicateList predList,
                      CostEstimate outerCost)
        throws StandardException
  {
    /* CHOOSE BEST CONGLOMERATE HERE */
    ConglomerateDescriptor  conglomerateDescriptor = null;
    ConglomerateDescriptor  bestConglomerateDescriptor = null;
    AccessPath bestAp = optimizable.getBestAccessPath();
    int lockMode = optimizable.getCurrentAccessPath().getLockMode();


    /*
 
View Full Code Here


      // now get table name, and constraint name if needed
      LanguageConnectionContext lcc =
                      activation.getLanguageConnectionContext();
      DataDictionary dd = lcc.getDataDictionary();
      //get the descriptors
      ConglomerateDescriptor cd = dd.getConglomerateDescriptor(indexCID);

      UUID tableID = cd.getTableID();
      TableDescriptor td = dd.getTableDescriptor(tableID);
      String tableName = td.getName();
     
      if (indexOrConstraintName == null) // no index name passed in
      {
        ConstraintDescriptor conDesc = dd.getConstraintDescriptor(td,
                                                                      cd.getUUID());
        indexOrConstraintName = conDesc.getConstraintName();
      }   

      StandardException se =
        StandardException.newException(
View Full Code Here

    /* Update the DataDictionary
     * RESOLVE - this will change in 1.4 because we will get
     * back the same conglomerate number
     */
    // Get the ConglomerateDescriptor for the heap
    ConglomerateDescriptor cd = td.getConglomerateDescriptor(oldHeapConglom);

    // Update sys.sysconglomerates with new conglomerate #
    dd.updateConglomerateDescriptor(cd, newHeapConglom, tc);
    tc.dropConglomerate(oldHeapConglom);
    // END RESOLVE
View Full Code Here

       * We create a unique index observer for unique indexes
       * so that we can catch duplicate key
       */

      // Get the ConglomerateDescriptor for the index
      ConglomerateDescriptor cd =
                td.getConglomerateDescriptor(constants.indexCIDS[index]);

      int[] baseColumnPositions =
                constants.irgs[index].baseColumnPositions();
      boolean[] isAscending     = constants.irgs[index].isAscending();
          
      int numColumnOrderings;
      SortObserver sortObserver = null;

      /* We can only reuse the wrappers when doing an
       * external sort if there is only 1 index.  Otherwise,
       * we could get in a situation where 1 sort reuses a
       * wrapper that is still in use in another sort.
       */
      boolean reuseWrappers = (numIndexes == 1);
      if (cd.getIndexDescriptor().isUnique())
      {
        numColumnOrderings = baseColumnPositions.length;
        String[] columnNames = getColumnNames(baseColumnPositions);

        String indexOrConstraintName = cd.getConglomerateName();
        if (cd.isConstraint())
        {
                    // so, the index is backing up a constraint

          ConstraintDescriptor conDesc =
                        dd.getConstraintDescriptor(td, cd.getUUID());

          indexOrConstraintName = conDesc.getConstraintName();
        }
        sortObserver =
                    new UniqueIndexSortObserver(
                            false, // don't clone rows
                            cd.isConstraint(),
                            indexOrConstraintName,
                            indexRows[index],
                            reuseWrappers,
                            td.getName());
      }
View Full Code Here

    // Populate each index
    for (int index = 0; index < numIndexes; index++)
    {
      ConglomerateController indexCC;
      Properties properties = new Properties();
      ConglomerateDescriptor cd;
      // Get the ConglomerateDescriptor for the index
      cd = td.getConglomerateDescriptor(constants.indexCIDS[index]);

     
      // Build the properties list for the new conglomerate
      indexCC = tc.openCompiledConglomerate(
                                false,
                                TransactionController.OPENMODE_FORUPDATE,
                                TransactionController.MODE_TABLE,
                                TransactionController.ISOLATION_SERIALIZABLE,
                constants.indexSCOCIs[index],
                indexDCOCIs[index]);

      // Get the properties on the old index
      indexCC.getInternalTablePropertySet(properties);

      /* Create the properties that language supplies when creating the
       * the index.  (The store doesn't preserve these.)
       */
      int indexRowLength = indexRows[index].nColumns();
      properties.put("baseConglomerateId", Long.toString(newHeapConglom));
      if (cd.getIndexDescriptor().isUnique())
      {
        properties.put("nUniqueColumns",
                 Integer.toString(indexRowLength - 1));
      }
      else
      {
        properties.put("nUniqueColumns",
                 Integer.toString(indexRowLength));
      }
      properties.put("rowLocationColumn",
              Integer.toString(indexRowLength - 1));
      properties.put("nKeyFields", Integer.toString(indexRowLength));

      indexCC.close();

      // We can finally drain the sorter and rebuild the index
      // RESOLVE - all indexes are btrees right now
      // Populate the index.
      sorters[index].completedInserts();
      sorters[index] = null;
      rowSources[index] =
                new CardinalityCounter(tc.openSortRowSource(sortIds[index]));

      newIndexCongloms[index] =
                tc.createAndLoadConglomerate(
                    "BTREE",
                    indexRows[index].getRowArray(),
                    ordering[index],
                    collation[index],
                    properties,
                    TransactionController.IS_DEFAULT,
                    rowSources[index],
                    (long[]) null);

      CardinalityCounter cCount = (CardinalityCounter)rowSources[index];
      long numRows;
      if ((numRows = cCount.getRowCount()) > 0)
      {
        long[] c = cCount.getCardinality();
        DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();

        for (int i= 0; i < c.length; i++)
        {
          StatisticsDescriptor statDesc =
            new StatisticsDescriptor(dd, dd.getUUIDFactory().createUUID(),
                          cd.getUUID(), td.getUUID(),
                          "I", new
                            StatisticsImpl(numRows,
                                     c[i]),
                          i + 1);
          dd.addDescriptor(statDesc, null,
View Full Code Here

      /* For non-unique indexes, we order by all columns + the RID.
       * For unique indexes, we just order by the columns.
       * We create a unique index observer for unique indexes
       * so that we can catch duplicate key
       */
      ConglomerateDescriptor cd;
      // Get the ConglomerateDescriptor for the index
      cd = td.getConglomerateDescriptor(constants.indexCIDS[index]);
      int[] baseColumnPositions = constants.irgs[index].baseColumnPositions();
      boolean[] isAscending = constants.irgs[index].isAscending();
      int numColumnOrderings;
      SortObserver sortObserver = null;
      if (cd.getIndexDescriptor().isUnique())
      {
        numColumnOrderings = baseColumnPositions.length;
        String[] columnNames = getColumnNames(baseColumnPositions);

        String indexOrConstraintName = cd.getConglomerateName();
        if (cd.isConstraint())
        {
                    // so, the index is backing up a constraint
          ConstraintDescriptor conDesc =
                        dd.getConstraintDescriptor(td, cd.getUUID());
          indexOrConstraintName = conDesc.getConstraintName();
        }
        sortObserver =
                    new UniqueIndexSortObserver(
                            false, // don't clone rows
                            cd.isConstraint(),
                            indexOrConstraintName,
                            indexRows[index],
                            true,
                            td.getName());
      }
      else
      {
        numColumnOrderings = baseColumnPositions.length + 1;
        sortObserver       = new BasicSortObserver(false, false,
                           indexRows[index],
                           true);
      }
      ordering[index] = new ColumnOrdering[numColumnOrderings];
      for (int ii =0; ii < isAscending.length; ii++)
      {
        ordering[index][ii] = new IndexColumnOrder(ii, isAscending[ii]);
      }
      if (numColumnOrderings > isAscending.length)
            {
        ordering[index][isAscending.length] =
                    new IndexColumnOrder(isAscending.length);
            }

      // create the sorters
      sortIds[index] =
                tc.createSort(
                    (Properties)null,
                    indexRows[index].getRowArrayClone(),
                    ordering[index],
                    sortObserver,
                    false,      // not in order
                    rowCount,    // est rows 
                    -1        // est row size, -1 means no idea 
                    );

      needToDropSort[index] = true;
    }

    // Populate sorters and get the output of each sorter into a row
    // source.  The sorters have the indexed columns only and the columns
    // are in the correct order.
    rowSources = new RowLocationRetRowSource[numIndexes];
    // Fill in the RowSources
    SortController[]  sorters = new SortController[numIndexes];
    for (int index = 0; index < numIndexes; index++)
    {
      sorters[index] = tc.openSort(sortIds[index]);
      sorters[index].completedInserts();
      rowSources[index] = tc.openSortRowSource(sortIds[index]);
    }

    long[] newIndexCongloms = new long[numIndexes];

    // Populate each index
    for (int index = 0; index < numIndexes; index++)
    {
      ConglomerateController indexCC;
      Properties properties = new Properties();
      ConglomerateDescriptor cd;
      // Get the ConglomerateDescriptor for the index
      cd = td.getConglomerateDescriptor(constants.indexCIDS[index]);

     
      // Build the properties list for the new conglomerate
      indexCC = tc.openCompiledConglomerate(
                                false,
                                TransactionController.OPENMODE_FORUPDATE,
                                TransactionController.MODE_TABLE,
                                TransactionController.ISOLATION_SERIALIZABLE,
                constants.indexSCOCIs[index],
                indexDCOCIs[index]);

      // Get the properties on the old index
      indexCC.getInternalTablePropertySet(properties);

      /* Create the properties that language supplies when creating the
       * the index.  (The store doesn't preserve these.)
       */
      int indexRowLength = indexRows[index].nColumns();
      properties.put("baseConglomerateId", Long.toString(newHeapConglom));
      if (cd.getIndexDescriptor().isUnique())
      {
        properties.put("nUniqueColumns",
                 Integer.toString(indexRowLength - 1));
      }
      else
View Full Code Here

    boolean duplicate = false;
        long conglomId = 0;

    for (int i = 0; i < congDescs.length; i++)
    {
      ConglomerateDescriptor cd = congDescs[i];
      if ( ! cd.isIndex())
        continue;
      IndexRowGenerator irg = cd.getIndexDescriptor();
      int[] bcps = irg.baseColumnPositions();
      boolean[] ia = irg.isAscending();
      int j = 0;

      /* For an index to be considered a duplicate of already existing index, the
       * following conditions have to be satisfied:
       * 1. the set of columns (both key and include columns) and their
       *  order in the index is the same as that of an existing index AND
       * 2. the ordering attributes are the same AND
       * 3. both the previously existing index and the one being created
       *  are non-unique OR the previously existing index is unique
       */

      if ((bcps.length == baseColumnPositions.length) &&
          (irg.isUnique() || !unique) &&
        indexType.equals(irg.indexType()))
      {
        for (; j < bcps.length; j++)
        {
          if ((bcps[j] != baseColumnPositions[j]) || (ia[j] != isAscending[j]))
            break;
        }
      }

      if (j == baseColumnPositions.length// duplicate
      {
        /*
         * Don't allow users to create a duplicate index. Allow if being done internally
         * for a constraint
         */
        if (!isConstraint)
        {
          activation.addWarning(
              StandardException.newWarning(
                SQLState.LANG_INDEX_DUPLICATE,
                cd.getConglomerateName()));

          return;
        }

        //Duplicate indexes share the physical conglomerate underneath
        conglomId = cd.getConglomerateNumber();
        indexRowGenerator = cd.getIndexDescriptor();
        //DERBY-655 and DERBY-1343 
        //Duplicate indexes will have unqiue logical conglomerate UUIDs. 
        conglomerateUUID = dd.getUUIDFactory().createUUID();
        duplicate = true;
        break;
      }
    }

    /* If this index already has an essentially same one, we share the
     * conglomerate with the old one, and just simply add a descriptor
     * entry into SYSCONGLOMERATES.
     */
    DataDescriptorGenerator ddg = dd.getDataDescriptorGenerator();
    if (duplicate)
    {
      ConglomerateDescriptor cgd =
        ddg.newConglomerateDescriptor(conglomId, indexName, true,
                      indexRowGenerator, isConstraint,
                      conglomerateUUID, td.getUUID(), sd.getUUID() );
      dd.addDescriptor(cgd, sd, DataDictionary.SYSCONGLOMERATES_CATALOG_NUM, false, tc);
      // add newly added conglomerate to the list of conglomerate
      // descriptors in the td.
      ConglomerateDescriptorList cdl =
        td.getConglomerateDescriptorList();
      cdl.add(cgd);

      // can't just return yet, need to get member "indexTemplateRow"
      // because create constraint may use it
    }

    // Describe the properties of the index to the store using Properties
    // RESOLVE: The following properties assume a BTREE index.
    Properties  indexProperties;
   
    if (properties != null)
    {
      indexProperties = properties;
    }
    else
    {
      indexProperties = new Properties();
    }

    // Tell it the conglomerate id of the base table
    indexProperties.put("baseConglomerateId",
              Long.toString(td.getHeapConglomerateId()));

    // All indexes are unique because they contain the RowLocation.
    // The number of uniqueness columns must include the RowLocation
    // if the user did not specify a unique index.
    indexProperties.put("nUniqueColumns",
          Integer.toString(unique ? baseColumnPositions.length :
                        baseColumnPositions.length + 1)
              );

    // By convention, the row location column is the last column
    indexProperties.put("rowLocationColumn",
              Integer.toString(baseColumnPositions.length));

    // For now, all columns are key fields, including the RowLocation
    indexProperties.put("nKeyFields",
              Integer.toString(baseColumnPositions.length + 1));

    // For now, assume that all index columns are ordered columns
    if (! duplicate)
    {
      indexRowGenerator = new IndexRowGenerator(indexType, unique,
                          baseColumnPositions,
                          isAscending,
                          baseColumnPositions.length);
    }

    /* Now add the rows from the base table to the conglomerate.
     * We do this by scanning the base table and inserting the
     * rows into a sorter before inserting from the sorter
     * into the index.  This gives us better performance
     * and a more compact index.
     */

    rowSource = null;
    sortId = 0;
    boolean needToDropSort = false// set to true once the sorter is created

    /* bulkFetchSIze will be 16 (for now) unless
     * we are creating the table in which case it
     * will be 1.  Too hard to remove scan when
     * creating index on new table, so minimize
     * work where we can.
     */
    int bulkFetchSize = (forCreateTable) ? 1 : 16
    int numColumns = td.getNumberOfColumns();
    int approximateRowSize = 0;

    // Create the FormatableBitSet for mapping the partial to full base row
    FormatableBitSet bitSet = new FormatableBitSet(numColumns+1);
    for (int index = 0; index < baseColumnPositions.length; index++)
    {
      bitSet.set(baseColumnPositions[index]);
    }
    FormatableBitSet zeroBasedBitSet = RowUtil.shift(bitSet, 1);

    // Start by opening a full scan on the base table.
    scan = tc.openGroupFetchScan(
                            td.getHeapConglomerateId(),
              false,  // hold
              0// open base table read only
                            TransactionController.MODE_TABLE,
                            TransactionController.ISOLATION_SERIALIZABLE,
              zeroBasedBitSet,    // all fields as objects
              (DataValueDescriptor[]) null,  // startKeyValue
              0,    // not used when giving null start posn.
              null,  // qualifier
              (DataValueDescriptor[]) null,  // stopKeyValue
              0);    // not used when giving null stop posn.

    // Create an array to put base row template
    baseRows = new ExecRow[bulkFetchSize];
    indexRows = new ExecIndexRow[bulkFetchSize];
    compactBaseRows = new ExecRow[bulkFetchSize];

    try
    {
      // Create the array of base row template
      for (int i = 0; i < bulkFetchSize; i++)
      {
        // create a base row template
        baseRows[i] = activation.getExecutionFactory().getValueRow(maxBaseColumnPosition);

        // create an index row template
        indexRows[i] = indexRowGenerator.getIndexRowTemplate();

        // create a compact base row template
        compactBaseRows[i] = activation.getExecutionFactory().getValueRow(
                          baseColumnPositions.length);
      }

      indexTemplateRow = indexRows[0];

      // Fill the partial row with nulls of the correct type
      ColumnDescriptorList cdl = td.getColumnDescriptorList();
      int           cdlSize = cdl.size();
      for (int index = 0, numSet = 0; index < cdlSize; index++)
      {
        if (! zeroBasedBitSet.get(index))
        {
          continue;
        }
        numSet++;
        ColumnDescriptor cd = (ColumnDescriptor) cdl.elementAt(index);
        DataTypeDescriptor dts = cd.getType();


        for (int i = 0; i < bulkFetchSize; i++)
        {
          // Put the column in both the compact and sparse base rows
          baseRows[i].setColumn(index + 1,
                  dts.getNull());
          compactBaseRows[i].setColumn(numSet,
                  baseRows[i].getColumn(index + 1));
        }

        // Calculate the approximate row size for the index row
        approximateRowSize += dts.getTypeId().getApproximateLengthInBytes(dts);
      }

      // Get an array of RowLocation template
      RowLocation rl[] = new RowLocation[bulkFetchSize];
      for (int i = 0; i < bulkFetchSize; i++)
      {
        rl[i] = scan.newRowLocationTemplate();

        // Get an index row based on the base row
        indexRowGenerator.getIndexRow(compactBaseRows[i], rl[i], indexRows[i], bitSet);
      }

      /* now that we got indexTemplateRow, done for duplicate index
       */
      if (duplicate)
        return;

      /* For non-unique indexes, we order by all columns + the RID.
       * For unique indexes, we just order by the columns.
       * We create a unique index observer for unique indexes
       * so that we can catch duplicate key.
       * We create a basic sort observer for non-unique indexes
       * so that we can reuse the wrappers during an external
       * sort.
       */
      int numColumnOrderings;
      SortObserver sortObserver = null;
      if (unique)
      {
        numColumnOrderings = baseColumnPositions.length;
        // if the index is a constraint, use constraintname in possible error messagge
        String indexOrConstraintName = indexName;
        if  (conglomerateUUID != null)
        {
          ConglomerateDescriptor cd = dd.getConglomerateDescriptor(conglomerateUUID);
          if ((isConstraint) && (cd != null && cd.getUUID() != null && td != null))
          {
            ConstraintDescriptor conDesc = dd.getConstraintDescriptor(td,
                                                                      cd.getUUID());
            indexOrConstraintName = conDesc.getConstraintName();
          }
        }
        sortObserver = new UniqueIndexSortObserver(true, isConstraint,
                               indexOrConstraintName,
                               indexTemplateRow,
                               true,
                               td.getName());
      }
      else
      {
        numColumnOrderings = baseColumnPositions.length + 1;
        sortObserver = new BasicSortObserver(true, false,
                           indexTemplateRow,
                           true);
      }

      ColumnOrdering[]  order = new ColumnOrdering[numColumnOrderings];
      for (int i=0; i < numColumnOrderings; i++)
      {
        order[i] =
                    new IndexColumnOrder(
                        i,
                        unique || i < numColumnOrderings - 1 ?
                            isAscending[i] : true);
      }

      // create the sorter
      sortId = tc.createSort((Properties)null,
          indexTemplateRow.getRowArrayClone(),
          order,
          sortObserver,
          false,      // not in order
          scan.getEstimatedRowCount(),
          approximateRowSize  // est row size, -1 means no idea 
          );

      needToDropSort = true;

      // Populate sorter and get the output of the sorter into a row
      // source.  The sorter has the indexed columns only and the columns
      // are in the correct order.
      rowSource = loadSorter(baseRows, indexRows, tc,
                   scan, sortId, rl);

      conglomId =
                tc.createAndLoadConglomerate(
          indexType,
          indexTemplateRow.getRowArray()// index row template
          order, //colums sort order
                    indexRowGenerator.getColumnCollationIds(
                        td.getColumnDescriptorList()),
          indexProperties,
          TransactionController.IS_DEFAULT, // not temporary
          rowSource,
          (long[]) null);
     
    }
    finally
    {

      /* close the table scan */
      if (scan != null)
        scan.close();

      /* close the sorter row source before throwing exception */
      if (rowSource != null)
        rowSource.closeRowSource();

      /*
      ** drop the sort so that intermediate external sort run can be
      ** removed from disk
      */
      if (needToDropSort)
         tc.dropSort(sortId);
    }

    ConglomerateController indexController =
      tc.openConglomerate(
                conglomId, false, 0, TransactionController.MODE_TABLE,
                TransactionController.ISOLATION_SERIALIZABLE);

    // Check to make sure that the conglomerate can be used as an index
    if ( ! indexController.isKeyed())
    {
      indexController.close();
      throw StandardException.newException(SQLState.LANG_NON_KEYED_INDEX, indexName,
                               indexType);
    }
    indexController.close();

    //
    // Create a conglomerate descriptor with the conglomId filled in and
    // add it.
    //

    ConglomerateDescriptor cgd =
      ddg.newConglomerateDescriptor(conglomId, indexName, true,
                      indexRowGenerator, isConstraint,
                      conglomerateUUID, td.getUUID(), sd.getUUID() );

    dd.addDescriptor(cgd, sd, DataDictionary.SYSCONGLOMERATES_CATALOG_NUM, false, tc);

    // add newly added conglomerate to the list of conglomerate descriptors
    // in the td.
    ConglomerateDescriptorList cdl = td.getConglomerateDescriptorList();
    cdl.add(cgd);

    CardinalityCounter cCount = (CardinalityCounter)rowSource;
    long numRows;
    if ((numRows = cCount.getRowCount()) > 0)
    {
      long[] c = cCount.getCardinality();
      for (int i = 0; i < c.length; i++)
      {
        StatisticsDescriptor statDesc =
          new StatisticsDescriptor(dd, dd.getUUIDFactory().createUUID(),
                        cgd.getUUID(), td.getUUID(), "I", new StatisticsImpl(numRows, c[i]),
                        i + 1);
        dd.addDescriptor(statDesc, null,
                 DataDictionary.SYSSTATISTICS_CATALOG_NUM,
                 true, tc);
      }
View Full Code Here

    DependencyManager dm = dd.getDependencyManager();
    TransactionController tc = lcc.getTransactionExecute();
    //for indexes, we only invalidate sps, rest we ignore(ie views)
    dm.invalidateFor(td, DependencyManager.RENAME_INDEX, lcc);

    ConglomerateDescriptor conglomerateDescriptor =
      dd.getConglomerateDescriptor(oldObjectName, sd, true);

    if (conglomerateDescriptor == null)
      throw StandardException.newException(SQLState.LANG_INDEX_NOT_FOUND_DURING_EXECUTION,
      oldObjectName);

    /* Drop the index descriptor */
    dd.dropConglomerateDescriptor(conglomerateDescriptor, tc);
    // Change the index name of the index descriptor
    conglomerateDescriptor.setConglomerateName(newObjectName);
    // add the index descriptor with new name
    dd.addDescriptor(conglomerateDescriptor, sd,
             DataDictionary.SYSCONGLOMERATES_CATALOG_NUM, false, tc);
  }
View Full Code Here

 
  public void executeConstantAction(Activation activation)
    throws StandardException
  {
    TableDescriptor td;
    ConglomerateDescriptor cd = null;

    LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
    DataDictionary dd = lcc.getDataDictionary();
    DependencyManager dm = dd.getDependencyManager();
    TransactionController tc = lcc.getTransactionExecute();


    dd.startWriting(lcc);

    if (forTable)
    {
      td = dd.getTableDescriptor(objectName, sd);
    }
   
    else
    {
      cd = dd.getConglomerateDescriptor(objectName,
                       sd, false);
      td = dd.getTableDescriptor(cd.getTableID());
    }

    /* invalidate all SPS's on the table-- bad plan on SPS, so user drops
     * statistics and would want SPS's invalidated so that recompile would
     * give good plans; thats the theory anyways....
     */
    dm.invalidateFor(td, DependencyManager.DROP_STATISTICS, lcc);

    dd.dropStatisticsDescriptors(td.getUUID(), ((cd != null) ? cd.getUUID() :
                   null), tc);
  }
View Full Code Here

    long[] dropped = new long[cds.length - 1];
    int numDropped = 0;
    for (int index = 0; index < cds.length; index++)
    {
      ConglomerateDescriptor cd = cds[index];

      /* if it's for an index, since similar indexes share one
       * conglomerate, we only drop the conglomerate once
       */
      if (cd.getConglomerateNumber() != heapId)
      {
        long thisConglom = cd.getConglomerateNumber();

        int i;
        for (i = 0; i < numDropped; i++)
        {
          if (dropped[i] == thisConglom)
            break;
        }
        if (i == numDropped// not dropped
        {
          dropped[numDropped++] = thisConglom;
          tc.dropConglomerate(thisConglom);
          dd.dropStatisticsDescriptors(td.getUUID(), cd.getUUID(), tc);
        }
      }
    }

    /* Prepare all dependents to invalidate.  (This is there chance
View Full Code Here

TOP

Related Classes of org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.