You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by mi...@apache.org on 2005/04/15 16:28:04 UTC
svn commit: r161468 [2/2] - in incubator/derby/code/trunk/java:
engine/org/apache/derby/catalog/ engine/org/apache/derby/iapi/db/
engine/org/apache/derby/iapi/store/access/
engine/org/apache/derby/iapi/store/access/conglomerate/
engine/org/apache/derby/iapi/store/raw/
engine/org/apache/derby/impl/sql/catalog/
engine/org/apache/derby/impl/store/access/
engine/org/apache/derby/impl/store/access/btree/
engine/org/apache/derby/impl/store/access/btree/index/
engine/org/apache/derby/impl/store/access/conglomerate/
engine/org/apache/derby/impl/store/access/heap/
engine/org/apache/derby/impl/store/access/sort/
engine/org/apache/derby/impl/store/raw/data/
testing/org/apache/derbyTesting/functionTests/master/
testing/org/apache/derbyTesting/functionTests/suites/
testing/org/apache/derbyTesting/functionTests/tests/store/
testing/org/apache/derbyTesting/functionTests/tests/storetests/
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapController.java Fri Apr 15 07:27:56 2005
@@ -70,7 +70,7 @@
/**************************************************************************
* Protected concrete impl of abstract methods of
- * GenericCongloemrateController class:
+ * GenericConglomerateController class:
**************************************************************************
*/
protected final void getRowPositionFromRowLocation(
@@ -105,6 +105,93 @@
* Private/Protected methods of This class:
**************************************************************************
*/
+
+ /**
+ * Check and purge committed deleted rows on a page.
+ * <p>
+ *
+ * @return true, if no purging has been done on page, and thus latch
+ * can be released before end transaction. Otherwise the latch
+ * on the page can not be released before commit.
+ *
+ * @param page A non-null, latched page must be passed in. If all
+ * rows on page are purged, then page will be removed and
+ * latch released.
+ *
+ * @exception StandardException Standard exception policy.
+ **/
+ protected final boolean purgeCommittedDeletes(
+ Page page)
+ throws StandardException
+ {
+ boolean purgingDone = false;
+
+ // The number records that can be reclaimed is:
+ // total recs - recs_not_deleted
+ int num_possible_commit_delete =
+ page.recordCount() - page.nonDeletedRecordCount();
+
+ if (num_possible_commit_delete > 0)
+ {
+ // loop backward so that purges which affect the slot table
+ // don't affect the loop (ie. they only move records we
+ // have already looked at).
+ for (int slot_no = page.recordCount() - 1;
+ slot_no >= 0;
+ slot_no--)
+ {
+ boolean row_is_committed_delete =
+ page.isDeletedAtSlot(slot_no);
+
+ if (row_is_committed_delete)
+ {
+ // At this point we only know that the row is
+ // deleted, not whether it is committed.
+
+ // see if we can purge the row, by getting an
+ // exclusive lock on the row. If it is marked
+ // deleted and we can get this lock, then it
+ // must be a committed delete and we can purge
+ // it.
+
+ RecordHandle rh =
+ page.fetchFromSlot(
+ (RecordHandle) null,
+ slot_no,
+ RowUtil.EMPTY_ROW,
+ RowUtil.EMPTY_ROW_FETCH_DESCRIPTOR,
+ true);
+
+ row_is_committed_delete =
+ this.lockRowAtSlotNoWaitExclusive(rh);
+
+ if (row_is_committed_delete)
+ {
+ purgingDone = true;
+
+ page.purgeAtSlot(slot_no, 1, false);
+ }
+ }
+ }
+ }
+ if (page.recordCount() == 0)
+ {
+
+ // Deallocate the current page with 0 rows on it.
+ this.removePage(page);
+
+ // removePage guarantees to unlatch the page even if an
+ // exception is thrown. The page is protected against reuse
+ // because removePage locks it with a dealloc lock, so it
+ // is OK to release the latch even after a purgeAtSlot is
+ // called.
+ // @see ContainerHandle#removePage
+
+ purgingDone = true;
+ }
+
+ return(purgingDone);
+ }
/**
* Insert a new row into the heap.
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapScan.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapScan.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapScan.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/heap/HeapScan.java Fri Apr 15 07:27:56 2005
@@ -147,6 +147,28 @@
}
}
+ protected void setRowLocationArray(
+ RowLocation[] rowloc_array,
+ int index,
+ RecordHandle rh)
+ throws StandardException
+ {
+ if (rowloc_array[index] == null)
+ {
+ rowloc_array[index] = new HeapRowLocation(rh);
+ }
+ else
+ {
+ if (SanityManager.DEBUG)
+ {
+ SanityManager.ASSERT(
+ rowloc_array[index] instanceof HeapRowLocation);
+ }
+
+ ((HeapRowLocation)rowloc_array[index]).setFrom(rh);
+ }
+ }
+
/**
Fetch the row at the next position of the Scan.
@@ -252,6 +274,16 @@
(BackingStoreHashtable) null,
row_array.length,
(int[]) null));
+ }
+
+ public int fetchNextGroup(
+ DataValueDescriptor[][] row_array,
+ RowLocation[] old_rowloc_array,
+ RowLocation[] new_rowloc_array)
+ throws StandardException
+ {
+ throw(StandardException.newException(
+ SQLState.HEAP_UNIMPLEMENTED_FEATURE));
}
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/Scan.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/Scan.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/Scan.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/Scan.java Fri Apr 15 07:27:56 2005
@@ -98,6 +98,17 @@
SQLState.SORT_IMPROPER_SCAN_METHOD);
}
+ public int fetchNextGroup(
+ DataValueDescriptor[][] row_array,
+ RowLocation[] old_rowloc_array,
+ RowLocation[] new_rowloc_array)
+ throws StandardException
+ {
+ throw StandardException.newException(
+ SQLState.SORT_IMPROPER_SCAN_METHOD);
+ }
+
+
/**
* Insert all rows that qualify for the current scan into the input
* Hash table.
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocExtent.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocExtent.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocExtent.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocExtent.java Fri Apr 15 07:27:56 2005
@@ -423,6 +423,34 @@
setExtentFreePageStatus(true);
}
+ protected long compressPages()
+ {
+ int compress_bitnum = -1;
+
+ for (int i = extentLength - 1; i >= 0; i--)
+ {
+ if (freePages.isSet(i))
+ {
+ freePages.clear(i);
+ compress_bitnum = i;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if (compress_bitnum >= 0)
+ {
+ extentLength = compress_bitnum;
+ return(extentStart + extentLength - 1);
+ }
+ else
+ {
+ return(-1);
+ }
+
+ }
protected long getExtentEnd()
{
@@ -764,14 +792,20 @@
for (int j = 0; j < 8; j++)
{
if (((1 << j) & free[i]) != 0)
+ {
allocatedPageCount--;
+ }
}
}
}
if (SanityManager.DEBUG)
- SanityManager.ASSERT(allocatedPageCount >= 0,
- "number of allocated page < 0");
+ {
+ SanityManager.ASSERT(
+ allocatedPageCount >= 0,
+ "number of allocated page < 0, val =" + allocatedPageCount +
+ "\nextent = " + toDebugString());
+ }
return allocatedPageCount;
}
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocPage.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocPage.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocPage.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/AllocPage.java Fri Apr 15 07:27:56 2005
@@ -958,7 +958,36 @@
}
+ /**
+ compress
+ @param myContainer the container object
+ */
+ protected boolean compress(
+ FileContainer myContainer)
+ throws StandardException
+ {
+ boolean all_pages_compressed = false;
+
+ if (SanityManager.DEBUG)
+ SanityManager.ASSERT(isLatched(), "page is not latched");
+
+ long last_valid_page = extent.compressPages();
+ if (last_valid_page >= 0)
+ {
+ // a non-negative return means that pages can be returned to
+ // the operating system.
+ myContainer.truncatePages(last_valid_page);
+
+ if (last_valid_page == this.getPageNumber())
+ {
+ // all pages of the extent have been returned to OS.
+ all_pages_compressed = true;
+ }
+ }
+
+ return(all_pages_compressed);
+ }
/*********************************************************************
* Extent Testing
@@ -968,6 +997,4 @@
*
*********************************************************************/
public static final String TEST_MULTIPLE_ALLOC_PAGE = SanityManager.DEBUG ? "TEST_MULTI_ALLOC_PAGE" : null;
-
}
-
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainer.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainer.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainer.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainer.java Fri Apr 15 07:27:56 2005
@@ -165,6 +165,68 @@
/**
+ Release free space to the OS.
+ <P>
+ As is possible release any free space to the operating system. This
+ will usually mean releasing any free pages located at the end of the
+ file using the java truncate() interface.
+
+ @exception StandardException Standard Cloudscape error policy
+ */
+ public void compressContainer(BaseContainerHandle handle)
+ throws StandardException
+ {
+ RawTransaction ntt = handle.getTransaction().startNestedTopTransaction();
+
+ int mode = handle.getMode();
+
+ if (SanityManager.DEBUG)
+ {
+ SanityManager.ASSERT((mode & ContainerHandle.MODE_FORUPDATE) ==
+ ContainerHandle.MODE_FORUPDATE,
+ "addPage handle not for update");
+ }
+
+ // if we are not in the same transaction as the one which created the
+ // container and the container may have logged some operation already,
+ // then we need to log allocation regardless of whether user changes
+ // are logged. Otherwise, the database will be corrupted if it
+ // crashed.
+ if ((mode & ContainerHandle.MODE_CREATE_UNLOGGED) == 0 &&
+ (mode & ContainerHandle.MODE_UNLOGGED) ==
+ ContainerHandle.MODE_UNLOGGED)
+ mode &= ~ContainerHandle.MODE_UNLOGGED;
+
+ // make a handle which is tied to the ntt, not to the user transaction
+ // this handle is tied to. The container is already locked by the
+ // user transaction, open it nolock
+ BaseContainerHandle allocHandle = (BaseContainerHandle)
+ ntt.openContainer(identity, (LockingPolicy)null, mode);
+
+ if (allocHandle == null)
+ {
+ throw StandardException.newException(
+ SQLState.DATA_ALLOC_NTT_CANT_OPEN,
+ new Long(getSegmentId()),
+ new Long(getContainerId()));
+ }
+
+ // Latch this container, the commit will release the latch
+ ntt.getLockFactory().lockObject(
+ ntt, ntt, this, null, C_LockFactory.WAIT_FOREVER);
+
+ try
+ {
+ compressContainer(ntt, allocHandle);
+ }
+ finally
+ {
+ ntt.commitNoSync(Transaction.RELEASE_LOCKS);
+ ntt.close();
+ }
+ }
+
+ /**
Add a page to this container.
<BR> MT - thread aware -
@@ -650,6 +712,14 @@
int flag)
throws StandardException;
+ protected abstract BasePage getPageForCompress(
+ BaseContainerHandle handle,
+ int flag,
+ long pageno)
+ throws StandardException;
+
+ protected abstract void truncatePages(long lastValidPagenum);
+
/**
Create a new page in the container.
@@ -660,6 +730,11 @@
RawTransaction t,
BaseContainerHandle allocHandle,
boolean isOverflow) throws StandardException;
+
+ protected abstract void compressContainer(
+ RawTransaction t,
+ BaseContainerHandle allocHandle)
+ throws StandardException;
/**
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainerHandle.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainerHandle.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainerHandle.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseContainerHandle.java Fri Apr 15 07:27:56 2005
@@ -181,6 +181,22 @@
}
/**
+ Release free space to the OS.
+ <P>
+ As is possible release any free space to the operating system. This
+ will usually mean releasing any free pages located at the end of the
+ file using the java truncate() interface.
+
+ @exception StandardException Standard Cloudscape error policy
+ */
+ public void compressContainer() throws StandardException
+ {
+ checkUpdateOpen();
+
+ container.compressContainer(this);
+ }
+
+ /**
Add a page to the container, if flag == ContainerHandle.ADD_PAGE_BULK,
tell the container about it.
@@ -336,6 +352,14 @@
checkUpdateOpen();
return container.getPageForInsert(this, flag);
+ }
+
+ public Page getPageForCompress(int flag, long pageno)
+ throws StandardException
+ {
+ checkUpdateOpen();
+
+ return container.getPageForCompress(this, flag, pageno);
}
/**
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BasePage.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BasePage.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BasePage.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BasePage.java Fri Apr 15 07:27:56 2005
@@ -412,10 +412,10 @@
*/
public RecordHandle fetch(
- RecordHandle handle,
- Object[] row,
- FormatableBitSet validColumns,
- boolean forUpdate)
+ RecordHandle handle,
+ Object[] row,
+ FormatableBitSet validColumns,
+ boolean forUpdate)
throws StandardException {
if (SanityManager.DEBUG) {
@@ -450,7 +450,7 @@
public RecordHandle fetchFromSlot(
RecordHandle rh,
int slot,
- Object[] row,
+ Object[] row,
FetchDescriptor fetchDesc,
boolean ignoreDelete)
throws StandardException
@@ -1395,12 +1395,11 @@
// page does not copy over the remaining pieces, i.e.,the new head page
// still points to those pieces.
- owner.getActionSet().actionPurge (t, this, src_slot, num_rows,
- recordIds, true);
+ owner.getActionSet().actionPurge(
+ t, this, src_slot, num_rows, recordIds, true);
}
-
/**
Unlatch the page.
@see Page#unlatch
@@ -2488,7 +2487,6 @@
*/
public abstract boolean spaceForCopy(int num_rows, int[] spaceNeeded)
throws StandardException;
-
/**
Return the total number of bytes used, reserved, or wasted by the
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/FileContainer.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/FileContainer.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/FileContainer.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/FileContainer.java Fri Apr 15 07:27:56 2005
@@ -1281,6 +1281,124 @@
}
+ /**
+ Compress free space from container.
+
+ <BR> MT - thread aware - It is assumed that our caller (our super class)
+ has already arranged a logical lock on page allocation to only allow a
+ single thread through here.
+
+ Compressing free space is done in allocation page units, working
+ it's way from the end of the container to the beginning. Each
+ loop operates on the last allocation page in the container.
+
+ Freeing space in the container page involves 2 transactions, an
+ update to an allocation page, N data pages, and possibly the delete
+ of the allocation page.
+ The User Transaction (UT) initiated the compress call.
+ The Nested Top Transaction (NTT) is the transaction started by RawStore
+ inside the compress call. This NTT is committed before compress returns.
+ The NTT is used to access high traffic data structures such as the
+ AllocPage.
+
+ This is outline of the algorithm used in compressing the container.
+
+ Until a non free page is found loop, in each loop return to the OS
+ all space at the end of the container occupied by free pages, including
+ the allocation page itself if all of it's pages are free.
+
+ 1) Find last 2 allocation pages in container (last if there is only one).
+ 2) invalidate the allocation information cached by the container.
+ Without the cache no page can be gotten from the container. Pages
+ already in the page cache are not affected. Thus by latching the
+ allocPage and invalidating the allocation cache, this NTT blocks out
+ all page gets from this container until it commits.
+ 3) the allocPage determines which pages can be released to the OS,
+ mark that in its data structure (the alloc extent). Mark the
+ contiguous block of nallocated/free pages at the end of the file
+ as unallocated. This change is associated with the NTT.
+ 4) The NTT calls the OS to deallocate the space from the file. Note
+ that the system can handle being booted and asked to get an allocated
+ page which is past end of file, it just extends the file automatically.
+ 5) If freeing all space on the alloc page, and there is more than one
+ alloc page, then free the alloc page - this requires an update to the
+ previous alloc page which the loop has kept latched also.
+ 6) if the last alloc page was deleted, restart loop at #1
+
+ All NTT latches are released before this routine returns.
+ If we use an NTT, the caller has to commit the NTT to release the
+ allocPage latch. If we don't use an NTT, the allocPage latch is released
+ as this routine returns.
+
+ @param ntt - the nested top transaction for the purpose of freeing space.
+ If ntt is null, use the user transaction for allocation.
+ #param allocHandle - the container handle opened by the ntt,
+ use this to latch the alloc page
+
+ @exception StandardException Standard Cloudscape error policy
+ */
+ protected void compressContainer(
+ RawTransaction ntt,
+ BaseContainerHandle allocHandle)
+ throws StandardException
+ {
+ AllocPage alloc_page = null;
+ AllocPage prev_alloc_page = null;
+
+ if (firstAllocPageNumber == ContainerHandle.INVALID_PAGE_NUMBER)
+ {
+ // no allocation pages in container, no work to do!
+ return;
+ }
+
+ try
+ {
+ synchronized(allocCache)
+ {
+ // loop until last 2 alloc pages are reached.
+ alloc_page = (AllocPage)
+ allocHandle.getAllocPage(firstAllocPageNumber);
+
+ while (!alloc_page.isLast())
+ {
+ if (prev_alloc_page != null)
+ {
+ // there are more than 2 alloc pages, unlatch the
+ // earliest one.
+ prev_alloc_page.unlatch();
+ }
+ prev_alloc_page = alloc_page;
+ alloc_page = null;
+
+ long nextAllocPageNumber =
+ prev_alloc_page.getNextAllocPageNumber();
+ long nextAllocPageOffset =
+ prev_alloc_page.getNextAllocPageOffset();
+
+ alloc_page = (AllocPage)
+ allocHandle.getAllocPage(nextAllocPageNumber);
+ }
+
+ alloc_page.compress(this);
+
+ allocCache.invalidate();
+ }
+ }
+ catch (StandardException se)
+ {
+
+ if (alloc_page != null)
+ {
+ alloc_page.unlatch();
+ alloc_page = null;
+ }
+ if (prev_alloc_page != null)
+ {
+ prev_alloc_page.unlatch();
+ prev_alloc_page = null;
+ }
+ }
+ }
/**
Create a new page in the container.
@@ -2487,6 +2605,15 @@
*/
return p;
}
+
+ protected BasePage getPageForCompress(
+ BaseContainerHandle handle,
+ int flag,
+ long pageno)
+ throws StandardException
+ {
+ return(getPageForInsert(handle, flag));
+ }
/**
Get a potentially suitable page for insert and latch it.
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/InputStreamContainer.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/InputStreamContainer.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/InputStreamContainer.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/InputStreamContainer.java Fri Apr 15 07:27:56 2005
@@ -132,6 +132,13 @@
return 0;
}
+ protected void truncatePages(long lastValidPagenum)
+ {
+ // Nothing to do since we are inherently read-only.
+ return;
+ }
+
+
/*
** Container creation, opening, and closing
*/
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/RAFContainer.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/RAFContainer.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/RAFContainer.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/RAFContainer.java Fri Apr 15 07:27:56 2005
@@ -537,6 +537,54 @@
return n;
}
+ /**
+ * Short one line description of routine.
+ * <p>
+ * Longer descrption of routine.
+ * <p>
+ *
+ * @return The identifier to be used to open the conglomerate later.
+ *
+ * @param param1 param1 does this.
+ * @param param2 param2 does this.
+ *
+ * @exception StandardException Standard exception policy.
+ **/
+ protected void truncatePages(
+ long lastValidPagenum)
+ {
+ // int n = doTruncatePages(lastValidPagenum);
+
+ synchronized(this)
+ {
+ boolean inwrite = false;
+ try
+ {
+ dataFactory.writeInProgress();
+ inwrite = true;
+
+ fileData.setLength((lastValidPagenum + 1) * pageSize);
+ }
+ catch (IOException ioe)
+ {
+ // The disk may have run out of space.
+ // Don't error out in un-allocation since application can
+ // still function even if allocation fails.
+ }
+ catch (StandardException se)
+ {
+ // some problem calling writeInProgress
+ }
+ finally
+ {
+ if (inwrite)
+ dataFactory.writeFinished();
+ }
+ }
+
+ return;
+ }
+
/*
Write the header of a random access file and sync it
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StoredPage.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StoredPage.java?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StoredPage.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StoredPage.java Fri Apr 15 07:27:56 2005
@@ -1374,6 +1374,17 @@
return((freeSpace - bytesNeeded) >= 0);
}
+ protected boolean spaceForCopy(int spaceNeeded)
+ {
+ // add up the space needed by the rows, add in minimumRecordSize
+ // if length of actual row is less than minimumRecordSize.
+ int bytesNeeded = slotEntrySize +
+ (spaceNeeded >= minimumRecordSize ?
+ spaceNeeded : minimumRecordSize);
+
+ return((freeSpace - bytesNeeded) >= 0);
+ }
+
/**
* Read the record at the given slot into the given row.
* <P>
@@ -6807,6 +6818,149 @@
overflowPage.unlatch();
return count;
}
+
+ /**
+ * Move record to a page toward the beginning of the file.
+ * <p>
+ * As part of compressing the table records need to be moved from the
+ * end of the file toward the beginning of the file. Only the
+ * contiguous set of free pages at the very end of the file can
+ * be given back to the OS. This call is used to purge the row from
+ * the current page, insert it into a previous page, and return the
+ * new row location
+ * Mark the record identified by position as deleted. The record may be
+ * undeleted sometime later using undelete() by any transaction that sees
+ * the record.
+ * <p>
+ * The interface is optimized to work on a number of rows at a time,
+ * optimally processing all rows on the page at once. The call will
+ * process either all rows on the page, or the number of slots in the
+ * input arrays - whichever is smaller.
+ * <B>Locking Policy</B>
+ * <P>
+ * MUST be called with table locked, not locks are requested. Because
+ * it is called with table locks the call will go ahead and purge any
+ * row which is marked deleted. It will also use purge rather than
+ * delete to remove the old row after it moves it to a new page. This
+ * is ok since the table lock insures that no other transaction will
+ * use space on the table before this transaction commits.
+ *
+ * <BR>
+ * A page latch on the new page will be requested and released.
+ *
+ * @param old_handle An array to be filled in by the call with the
+ * old handles of all rows moved.
+ * @param new_handle An array to be filled in by the call with the
+ * new handles of all rows moved.
+ * @param new_pageno An array to be filled in by the call with the
+ * new page number of all rows moved.
+ *
+ * @return the number of rows processed.
+ *
+ * @exception StandardException Standard Cloudscape error policy
+ *
+ * @see LockingPolicy
+ **/
+ public int moveRecordForCompressAtSlot(
+ int slot,
+ Object[] row,
+ RecordHandle[] old_handle,
+ RecordHandle[] new_handle)
+ throws StandardException
+ {
+ long src_pageno = getPageNumber();
+
+ try
+ {
+ fetchFromSlot(
+ null,
+ slot,
+ row,
+ (FetchDescriptor) null, // all columns retrieved
+ false);
+
+ int row_size = getRecordPortionLength(slot);
+
+ // first see if row will fit on current page being used to insert
+ StoredPage dest_page =
+ (StoredPage) owner.getPageForCompress(0, src_pageno);
+
+ if (dest_page != null)
+ {
+ SanityManager.DEBUG_PRINT("moveRecordForCompressAtSlot",
+ "last = " + dest_page.getPageNumber());
+
+ if ((dest_page.getPageNumber() >= getPageNumber()) ||
+ (!dest_page.spaceForCopy(row_size)))
+ {
+ // page won't work
+ dest_page.unlatch();
+ dest_page = null;
+ }
+ }
+
+ if (dest_page == null)
+ {
+ // last page did not work, try unfilled page
+ dest_page = (StoredPage)
+ owner.getPageForCompress(
+ ContainerHandle.GET_PAGE_UNFILLED, src_pageno);
+
+ if (dest_page != null)
+ {
+ SanityManager.DEBUG_PRINT("moveRecordForCompressAtSlot",
+ "unfill = " + dest_page.getPageNumber());
+
+ if ((dest_page.getPageNumber() >= getPageNumber()) ||
+ (!dest_page.spaceForCopy(row_size)))
+ {
+ // page won't work
+ dest_page.unlatch();
+ dest_page = null;
+ }
+ }
+ }
+
+ if (dest_page == null)
+ {
+ // last and unfilled page did not work, try getting a free page
+ dest_page = (StoredPage) owner.addPage();
+
+ SanityManager.DEBUG_PRINT("moveRecordForCompressAtSlot",
+ "addPage = " + dest_page.getPageNumber());
+
+ if (dest_page.getPageNumber() >= getPageNumber())
+ {
+ owner.removePage(dest_page);
+ dest_page = null;
+ }
+ }
+
+ if (dest_page != null)
+ {
+ int dest_slot = dest_page.recordCount();
+
+ old_handle[0] = getRecordHandleAtSlot(slot);
+
+ copyAndPurge(dest_page, slot, 1, dest_slot);
+
+ new_handle[0] = dest_page.getRecordHandleAtSlot(dest_slot);
+
+ dest_page.unlatch();
+
+ return(1);
+ }
+ else
+ {
+ return(0);
+ }
+ }
+ catch (IOException ioe)
+ {
+ throw StandardException.newException(
+ SQLState.DATA_UNEXPECTED_EXCEPTION, ioe);
+ }
+ }
/*
* methods that is called underneath a page action
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/onlineCompressTable.out
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/onlineCompressTable.out?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/onlineCompressTable.out (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/onlineCompressTable.out Fri Apr 15 07:27:56 2005
@@ -0,0 +1,88 @@
+ij> autocommit off;
+ij> -- start with simple test, does the call work?
+create table test1 (a int);
+0 rows inserted/updated/deleted
+ij> -- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('APP', 'TEST1');
+-- expect failures schema/table does not exist
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE(null, 'test2');
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('APP', 'test2');
+-- non existent schema
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('doesnotexist', 'a');
+-- cleanup
+drop table test1;
+0 rows inserted/updated/deleted
+ij> -- load up a table, delete most of it's rows and then see what compress does.
+create table test1 (keycol int, a char(250), b char(250), c char(250), d char(250));
+0 rows inserted/updated/deleted
+ij> insert into test1 values (1, 'a', 'b', 'c', 'd');
+1 row inserted/updated/deleted
+ij> insert into test1 (select keycol + 1, a, b, c, d from test1);
+1 row inserted/updated/deleted
+ij> insert into test1 (select keycol + 2, a, b, c, d from test1);
+2 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 4, a, b, c, d from test1);
+4 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 8, a, b, c, d from test1);
+8 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 16, a, b, c, d from test1);
+16 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 32, a, b, c, d from test1);
+32 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 64, a, b, c, d from test1);
+64 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 128, a, b, c, d from test1);
+128 rows inserted/updated/deleted
+ij> insert into test1 (select keycol + 256, a, b, c, d from test1);
+256 rows inserted/updated/deleted
+ij> create index test1_idx on test1(keycol);
+0 rows inserted/updated/deleted
+ij> commit;
+ij> select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+CONGLOMERATENAME |ISIND&|NUMALLOCATEDPAGES |NUMFREEPAGES |PAGESIZE |ESTIMSPACESAVING
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+TEST1 |0 |171 |0 |4096 |0
+TEST1_IDX |1 |4 |0 |4096 |0
+ij> delete from test1 where keycol > 300;
+212 rows inserted/updated/deleted
+ij> commit;
+ij> delete from test1 where keycol < 100;
+99 rows inserted/updated/deleted
+ij> commit;
+ij> call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 1, 0, 0);
+0 rows inserted/updated/deleted
+ij> select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+CONGLOMERATENAME |ISIND&|NUMALLOCATEDPAGES |NUMFREEPAGES |PAGESIZE |ESTIMSPACESAVING
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+TEST1 |0 |68 |103 |4096 |421888
+TEST1_IDX |1 |4 |0 |4096 |0
+ij> commit;
+ij> -- call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 0, 1, 0);
+select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+CONGLOMERATENAME |ISIND&|NUMALLOCATEDPAGES |NUMFREEPAGES |PAGESIZE |ESTIMSPACESAVING
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+TEST1 |0 |68 |103 |4096 |421888
+TEST1_IDX |1 |4 |0 |4096 |0
+ij> call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 0, 0, 1);
+0 rows inserted/updated/deleted
+ij> select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+CONGLOMERATENAME |ISIND&|NUMALLOCATEDPAGES |NUMFREEPAGES |PAGESIZE |ESTIMSPACESAVING
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+TEST1 |0 |68 |32 |4096 |131072
+TEST1_IDX |1 |4 |0 |4096 |0
+ij>
Modified: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/storetests.runall
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/storetests.runall?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/storetests.runall (original)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/storetests.runall Fri Apr 15 07:27:56 2005
@@ -1,4 +1,5 @@
storetests/st_schema.sql
+storetests/onlineCompressTable.sql
storetests/st_1.sql
storetests/st_b5772.sql
storetests/derby94.sql
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/BaseTest.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/BaseTest.java?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/BaseTest.java (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/BaseTest.java Fri Apr 15 07:27:56 2005
@@ -0,0 +1,78 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.functionTests.harness.procedure
+
+ Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+package org.apache.derbyTesting.functionTests.tests.store;
+
+import org.apache.derby.tools.ij;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+
+public abstract class BaseTest
+{
+ abstract void testList(Connection conn) throws SQLException;
+
+ void runTests(String[] argv)
+ throws Throwable
+ {
+ ij.getPropertyArg(argv);
+ Connection conn = ij.startJBMS();
+ System.out.println("conn from ij.startJBMS() = " + conn);
+ conn.setAutoCommit(false);
+
+ try
+ {
+ testList(conn);
+ }
+ catch (SQLException sqle)
+ {
+ org.apache.derby.tools.JDBCDisplayUtil.ShowSQLException(
+ System.out, sqle);
+ sqle.printStackTrace(System.out);
+ }
+ }
+
+ public BaseTest()
+ {
+ }
+
+ protected void beginTest(
+ Connection conn,
+ String str)
+ throws SQLException
+ {
+ log("Beginning test: " + str);
+ conn.commit();
+ }
+
+ protected void endTest(
+ Connection conn,
+ String str)
+ throws SQLException
+ {
+ conn.commit();
+ log("Ending test: " + str);
+ }
+ protected void log(String str)
+ {
+ System.out.println(str);
+ }
+}
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest.java?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest.java (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest.java Fri Apr 15 07:27:56 2005
@@ -0,0 +1,120 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.functionTests.harness.procedure
+
+ Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ */
+
+package org.apache.derbyTesting.functionTests.tests.store;
+
+import org.apache.derby.iapi.db.OnlineCompress;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.derby.tools.ij;
+
+
+public class OnlineCompressTest extends BaseTest
+{
+
+ OnlineCompressTest()
+ {
+ }
+
+
+ private void createAndLoadTable(
+ Connection conn,
+ String tblname)
+ throws SQLException
+ {
+ Statement s = conn.createStatement();
+
+ s.execute(
+ "create table " + tblname +
+ "(keycol int, indcol1 int, indcol2 int, indcol3 int, data1 varchar(2000), data2 varchar(2000))");
+
+ PreparedStatement insert_stmt =
+ conn.prepareStatement(
+ "insert into " + tblname + " values(?, ?, ?, ?, ?, ?)");
+
+ char[] data1_data = new char[500];
+ char[] data2_data = new char[500];
+
+ for (int i = 0; i < data1_data.length; i++)
+ {
+ data1_data[i] = 'a';
+ data2_data[i] = 'b';
+ }
+
+ String data1_str = new String(data1_data);
+ String data2_str = new String(data2_data);
+
+ for (int i = 0; i < 10000; i++)
+ {
+ insert_stmt.setInt(1, i); // keycol
+ insert_stmt.setInt(2, i * 10); // indcol1
+ insert_stmt.setInt(3, i * 100); // indcol2
+ insert_stmt.setInt(4, -i); // indcol3
+ insert_stmt.setString(5, data1_str); // data1_data
+ insert_stmt.setString(6, data2_str); // data2_data
+ }
+
+ conn.commit();
+ }
+
+ private void test1(Connection conn)
+ throws SQLException
+ {
+ beginTest(conn, "test1");
+
+ createAndLoadTable(conn, "test1");
+
+ OnlineCompress.compressTable("APP", "TEST1", true, true, true);
+
+ endTest(conn, "test1");
+ }
+
+ public void testList(Connection conn)
+ throws SQLException
+ {
+ test1(conn);
+ }
+
+ public static void main(String[] argv)
+ throws Throwable
+ {
+ OnlineCompressTest test = new OnlineCompressTest();
+
+ ij.getPropertyArg(argv);
+ Connection conn = ij.startJBMS();
+ System.out.println("conn 2 from ij.startJBMS() = " + conn);
+ conn.setAutoCommit(false);
+
+ try
+ {
+ test.testList(conn);
+ }
+ catch (SQLException sqle)
+ {
+ org.apache.derby.tools.JDBCDisplayUtil.ShowSQLException(
+ System.out, sqle);
+ sqle.printStackTrace(System.out);
+ }
+ }
+}
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_app.properties
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_app.properties?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_app.properties (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_app.properties Fri Apr 15 07:27:56 2005
@@ -0,0 +1 @@
+usedefaults=true
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_derby.properties
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_derby.properties?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_derby.properties (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/OnlineCompressTest_derby.properties Fri Apr 15 07:27:56 2005
@@ -0,0 +1 @@
+usedefaults=true
Modified: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/copyfiles.ant
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/copyfiles.ant?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/copyfiles.ant (original)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/copyfiles.ant Fri Apr 15 07:27:56 2005
@@ -123,3 +123,5 @@
xaOffline1_sed.properties
xab2354.sql
xab2354_sed.properties
+OnlineCompressTest_app.properties
+OnlineCompressTest_derby.properties
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/BaseTest.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/BaseTest.java?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/BaseTest.java (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/BaseTest.java Fri Apr 15 07:27:56 2005
@@ -0,0 +1,80 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.functionTests.harness.procedure
+
+ Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+package org.apache.derbyTesting.functionTests.tests.storetests;
+
+import com.ibm.db2j.functionTests.TestUtil;
+
+import org.apache.derby.tools.ij;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+
+public abstract class BaseTest
+{
+ abstract void testList(Connection conn) throws SQLException;
+
+ void runTests(String[] argv)
+ throws Throwable
+ {
+ ij.getPropertyArg(argv);
+ Connection conn = ij.startJBMS();
+ System.out.println("conn from ij.startJBMS() = " + conn);
+ conn.setAutoCommit(false);
+
+ try
+ {
+ testList(conn);
+ }
+ catch (SQLException sqle)
+ {
+ org.apache.derby.tools.JDBCDisplayUtil.ShowSQLException(
+ System.out, sqle);
+ sqle.printStackTrace(System.out);
+ }
+ }
+
+ public BaseTest()
+ {
+ }
+
+ protected void beginTest(
+ Connection conn,
+ String str)
+ throws SQLException
+ {
+ log("Beginning test: " + str);
+ conn.commit();
+ }
+
+ protected void endTest(
+ Connection conn,
+ String str)
+ throws SQLException
+ {
+ conn.commit();
+ log("Ending test: " + str);
+ }
+ protected void log(String str)
+ {
+ System.out.println(str);
+ }
+}
Modified: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/copyfiles.ant
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/copyfiles.ant?view=diff&r1=161467&r2=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/copyfiles.ant (original)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/copyfiles.ant Fri Apr 15 07:27:56 2005
@@ -6,3 +6,4 @@
st_b5772.sql
derby94.sql
derby94_derby.properties
+onlineCompressTable.sql
Added: incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/onlineCompressTable.sql
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/onlineCompressTable.sql?view=auto&rev=161468
==============================================================================
--- incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/onlineCompressTable.sql (added)
+++ incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/storetests/onlineCompressTable.sql Fri Apr 15 07:27:56 2005
@@ -0,0 +1,68 @@
+autocommit off;
+-- start with simple test, does the call work?
+create table test1 (a int);
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('APP', 'TEST1');
+
+-- expect failures schema/table does not exist
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE(null, 'test2');
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('APP', 'test2');
+
+-- non existent schema
+-- call SYSCS_UTIL.SYSCS_ONLINE_COMPRESS_TABLE('doesnotexist', 'a');
+
+-- cleanup
+drop table test1;
+
+
+-- load up a table, delete most of it's rows and then see what compress does.
+create table test1 (keycol int, a char(250), b char(250), c char(250), d char(250));
+insert into test1 values (1, 'a', 'b', 'c', 'd');
+insert into test1 (select keycol + 1, a, b, c, d from test1);
+insert into test1 (select keycol + 2, a, b, c, d from test1);
+insert into test1 (select keycol + 4, a, b, c, d from test1);
+insert into test1 (select keycol + 8, a, b, c, d from test1);
+insert into test1 (select keycol + 16, a, b, c, d from test1);
+insert into test1 (select keycol + 32, a, b, c, d from test1);
+insert into test1 (select keycol + 64, a, b, c, d from test1);
+insert into test1 (select keycol + 128, a, b, c, d from test1);
+insert into test1 (select keycol + 256, a, b, c, d from test1);
+
+create index test1_idx on test1(keycol);
+commit;
+
+select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+
+delete from test1 where keycol > 300;
+commit;
+delete from test1 where keycol < 100;
+commit;
+
+
+call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 1, 0, 0);
+
+select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+commit;
+
+-- call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 0, 1, 0);
+
+select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;
+
+call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('APP', 'TEST1', 0, 0, 1);
+
+select
+ conglomeratename, isindex, numallocatedpages, numfreepages, pagesize,
+ estimspacesaving
+ from new org.apache.derby.diag.SpaceTable('TEST1') t
+ order by conglomeratename;