Updates for latest Postgres 9.2 sources. REL9_2_0
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Mar 2012 16:08:33 +0000 (16:08 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Mar 2012 16:08:33 +0000 (16:08 +0000)
We no longer need pg_crc.c, and hence not a source tree, yay.

Makefile
Makefile.contrib
README.pg_filedump
pg_filedump.c
pg_filedump.h

index e78cfa747bbbf34b3f6f45dcfbbfd17213bc9c88..541861027b6a2b1f8c460421598b57068409d51f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,32 +1,27 @@
 # View README.pg_filedump first
 
-# note this must match macro in pg_filedump.h
-FD_VERSION=9.1.0
+# note this must match version macros in pg_filedump.h
+FD_VERSION=9.2.0
 
 CC=gcc
 CFLAGS=-g -O -Wall -Wmissing-prototypes -Wmissing-declarations
 
-# PGSQL MUST POINT TO pgsql SOURCE DIRECTORY
-PGSQL=../../pgsql
+# If working with a PG source directory, point PGSQL_INCLUDE_DIR to its
+# src/include subdirectory.  If working with an installed tree, point to
+# the server include subdirectory, eg /usr/local/include/postgresql/server
+PGSQL_INCLUDE_DIR=../../pgsql/src/include
 
-CRC_SRC_DIR=${PGSQL}/src/backend/utils/hash
-
-INCLUDE_DIR=${PGSQL}/src/include
 
 DISTFILES= README.pg_filedump Makefile Makefile.contrib \
        pg_filedump.h pg_filedump.c
 
-
 all: pg_filedump
 
-pg_filedump: pg_filedump.o pg_crc.o 
-       ${CC} ${CFLAGS} -o pg_filedump pg_filedump.o pg_crc.o
+pg_filedump: pg_filedump.o
+       ${CC} ${CFLAGS} -o pg_filedump pg_filedump.o
 
 pg_filedump.o: pg_filedump.c
-       ${CC} ${CFLAGS} -I${INCLUDE_DIR} pg_filedump.c -c
-
-pg_crc.o: ${CRC_SRC_DIR}/pg_crc.c
-       ${CC} ${CFLAGS} -I${INCLUDE_DIR} ${CRC_SRC_DIR}/pg_crc.c -c 
+       ${CC} ${CFLAGS} -I${PGSQL_INCLUDE_DIR} pg_filedump.c -c
 
 dist:
        rm -rf pg_filedump-${FD_VERSION} pg_filedump-${FD_VERSION}.tar.gz
index 847d5030039e02c1708afc1a808abcba3e5e33b0..45c98dcf8639a30430f14a3c818b8acdba4fb811 100644 (file)
@@ -1,7 +1,5 @@
 PROGRAM = pg_filedump
-OBJS   = pg_filedump.o pg_crc.o 
-
-EXTRA_CLEAN = pg_crc.c 
+OBJS   = pg_filedump.o
 
 DOCS = README.pg_filedump
 
@@ -15,6 +13,3 @@ top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
-
-pg_crc.c: $(top_srcdir)/src/backend/utils/hash/pg_crc.c
-       rm -f $@ && $(LN_S) $< .
index 97127cff02663b38199d3370618669bf09c182d6..63d086f6b40186c7236b6f989991fbad381c618e 100644 (file)
@@ -2,7 +2,7 @@ pg_filedump - Display formatted contents of a PostgreSQL heap, index,
               or control file.
 
 Copyright (c) 2002-2010 Red Hat, Inc.
-Copyright (c) 2011, PostgreSQL Global Development Group
+Copyright (c) 2011-2012, PostgreSQL Global Development Group
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -36,22 +36,24 @@ corrupt, you need a method of forcing a block size.
 Compile/Installation:
 
 To compile pg_filedump, you will need to have a properly configured
-PostgreSQL source tree for the appropriate PostgreSQL major version.
+PostgreSQL source tree or complete install tree (with include files)
+of the appropriate PostgreSQL major version.
 
-There are two makefiles included in this package.  Makefile is a
-standalone makefile for pg_filedump.  Alter the PGSQL variable to point
-to the PostgreSQL source tree.  Makefile.contrib can be used if this
-package was untarred in the contrib directory of a PostgreSQL build tree.
+There are two makefiles included in this package.  Makefile is a standalone
+makefile for pg_filedump.  Alter its PGSQL_INCLUDE_DIR variable to point to
+the PostgreSQL include files.  Makefile.contrib can be used if this package
+was untarred in the contrib directory of a PostgreSQL build tree.
 
   make
-  make install (if in the contrib directory)
+  make install (if using Makefile.contrib)
 
 It is also possible to use Makefile.contrib without being in the contrib
 directory:
 
   make -f Makefile.contrib USE_PGXS=1
 
-This will not eliminate the need to have a complete source tree, though.
+This method requires that the pg_config program be in your PATH, but should
+not require any manual adjustments of the Makefile.
 
 
 ------------------------------------------------------------------------
@@ -85,3 +87,6 @@ The following options are valid for control files:
   -c  Interpret the file listed as a control file
   -f  Display formatted content dump along with interpretation
   -S  Force block size to [blocksize]
+
+In most cases it's recommended to use the -i and -f options to get
+the most useful dump output.
index e56b86e18f64e74206bd89d08f8e789cba48eb92..eff02ab54e3d295436f7502c0e59fea209cb0705 100644 (file)
@@ -3,7 +3,7 @@
  *                 formatting heap (data), index and control files.
  *
  * Copyright (c) 2002-2010 Red Hat, Inc.
- * Copyright (c) 2011, PostgreSQL Global Development Group
+ * Copyright (c) 2011-2012, PostgreSQL Global Development Group
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Original Author: Patrick Macdonald <patrickm@redhat.com> 
+ * Original Author: Patrick Macdonald <patrickm@redhat.com>
  */
 
 #include "pg_filedump.h"
 
+#include "utils/pg_crc_tables.h"
+
 // Global variables for ease of use mostly
 static FILE *fp = NULL;                // File to dump or format
 static char *fileName = NULL;  // File name for display
@@ -54,7 +56,7 @@ static void DumpBinaryBlock ();
 static void DumpFileContents ();
 
 
-// Send properly formed usage information to the user. 
+// Send properly formed usage information to the user.
 static void
 DisplayOptions (unsigned int validOptions)
 {
@@ -62,7 +64,7 @@ DisplayOptions (unsigned int validOptions)
     printf
       ("\nVersion %s (for %s)"
        "\nCopyright (c) 2002-2010 Red Hat, Inc."
-       "\nCopyright (c) 2011, PostgreSQL Global Development Group\n",
+       "\nCopyright (c) 2011-2012, PostgreSQL Global Development Group\n",
        FD_VERSION, FD_PG_VERSION);
 
   printf
@@ -96,7 +98,7 @@ DisplayOptions (unsigned int validOptions)
 
 // Iterate through the provided options and set the option flags.
 // An error will result in a positive rc and will force a display
-// of the usage information.  This routine returns enum 
+// of the usage information.  This routine returns enum
 // optionReturnCode values.
 static unsigned int
 ConsumeOptions (int numOptions, char **options)
@@ -170,7 +172,7 @@ ConsumeOptions (int numOptions, char **options)
            }
        }
       // Check for the special case where the user forces a block size
-      // instead of having the tool determine it.  This is useful if  
+      // instead of having the tool determine it.  This is useful if
       // the header of block 0 is corrupt and gives a garbage block size
       else if ((optionStringLength == 2)
               && (strcmp (optionString, "-S") == 0))
@@ -220,8 +222,8 @@ ConsumeOptions (int numOptions, char **options)
            }
          else
            {
-             // Could be the case where the help flag is used without a 
-             // filename. Otherwise, the last option isn't a file            
+             // Could be the case where the help flag is used without a
+             // filename. Otherwise, the last option isn't a file
              if (strcmp (optionString, "-h") == 0)
                rc = OPT_RC_COPYRIGHT;
              else
@@ -250,12 +252,12 @@ ConsumeOptions (int numOptions, char **options)
            {
              switch (optionString[y])
                {
-                 // Use absolute addressing              
+                 // Use absolute addressing
                case 'a':
                  SET_OPTION (blockOptions, BLOCK_ABSOLUTE, 'a');
                  break;
 
-                 // Dump the binary contents of the page 
+                 // Dump the binary contents of the page
                case 'b':
                  SET_OPTION (blockOptions, BLOCK_BINARY, 'b');
                  break;
@@ -276,7 +278,7 @@ ConsumeOptions (int numOptions, char **options)
                  SET_OPTION (blockOptions, BLOCK_FORMAT, 'f');
                  break;
 
-                 // Display the usage screen  
+                 // Display the usage screen
                case 'h':
                  rc = OPT_RC_COPYRIGHT;
                  break;
@@ -325,7 +327,7 @@ ConsumeOptions (int numOptions, char **options)
 
   // If the user requested a control file dump, a pure binary
   // block dump or a non-interpreted formatted dump, mask off
-  // all other block level options (with a few exceptions)   
+  // all other block level options (with a few exceptions)
   if (rc == OPT_RC_VALID)
     {
       // The user has requested a control file dump, only -f and
@@ -366,8 +368,8 @@ ConsumeOptions (int numOptions, char **options)
   return (rc);
 }
 
-// Given the index into the parameter list, convert and return the 
-// current string to a number if possible 
+// Given the index into the parameter list, convert and return the
+// current string to a number if possible
 static int
 GetOptionValue (char *optionString)
 {
@@ -421,7 +423,7 @@ GetSpecialSectionType (Page page)
   unsigned int specialValue;
   PageHeader pageHeader = (PageHeader) page;
 
-  // If this is not a partial header, check the validity of the 
+  // If this is not a partial header, check the validity of the
   // special section offset and contents
   if (bytesToFormat > sizeof (PageHeaderData))
     {
@@ -439,7 +441,7 @@ GetSpecialSectionType (Page page)
 
          specialSize = blockSize - specialOffset;
 
-         // If there is a special section, use its size to guess its 
+         // If there is a special section, use its size to guess its
          // contents, checking the last 2 bytes of the page in cases
          // that are ambiguous.  Note we don't attempt to dereference
          // the pointers without checking bytesToFormat == blockSize.
@@ -530,7 +532,7 @@ CreateDumpFileHeader (int numOptions, char **options)
   time_t rightNow = time (NULL);
 
   // Iterate through the options and cache them.
-  // The maximum we can display is 50 option characters + spaces.  
+  // The maximum we can display is 50 option characters + spaces.
   for (x = 1; x < (numOptions - 1); x++)
     {
       if ((strlen (optionBuffer) + strlen (options[x])) > 50)
@@ -654,7 +656,7 @@ FormatHeader (Page page)
       (" Error: End of block encountered within the header."
        " Bytes read: %4u.\n\n", bytesToFormat);
 
-  // A request to dump the formatted binary of the block (header, 
+  // A request to dump the formatted binary of the block (header,
   // items and special section).  It's best to dump even on an error
   // so the user can see the raw image.
   if (blockOptions & BLOCK_FORMAT)
@@ -663,7 +665,7 @@ FormatHeader (Page page)
   return (rc);
 }
 
-// Dump out formatted items that reside on this block 
+// Dump out formatted items that reside on this block
 static void
 FormatItemBlock (Page page)
 {
@@ -682,8 +684,8 @@ FormatItemBlock (Page page)
   printf ("<Data> ------ \n");
 
   // Loop through the items on the block.  Check if the block is
-  // empty and has a sensible item array listed before running 
-  // through each item  
+  // empty and has a sensible item array listed before running
+  // through each item
   if (maxOffset == 0)
     printf (" Empty block - no items listed \n\n");
   else if ((maxOffset < 0) || (maxOffset > blockSize))
@@ -694,7 +696,7 @@ FormatItemBlock (Page page)
       int formatAs;
       char textFlags[16];
 
-      // First, honour requests to format items a special way, then 
+      // First, honour requests to format items a special way, then
       // use the special section to determine the format style
       if (itemOptions & ITEM_INDEX)
        formatAs = ITEM_INDEX;
@@ -766,11 +768,11 @@ FormatItemBlock (Page page)
          else
            {
              // If the user requests that the items be interpreted as
-             // heap or index items...     
+             // heap or index items...
              if (itemOptions & ITEM_DETAIL)
                FormatItem (itemSize, itemOffset, formatAs);
 
-             // Dump the items contents in hex and ascii 
+             // Dump the items contents in hex and ascii
              if (blockOptions & BLOCK_FORMAT)
                FormatBinary (itemSize, itemOffset);
 
@@ -945,7 +947,7 @@ FormatItem (unsigned int numBytes, unsigned int startIndex,
                    t_ctid.ip_blkid.bi_lo)), htup->t_ctid.ip_posid,
                  localNatts, htup->t_hoff);
 
-         // Place readable versions of the tuple info mask into a buffer.  
+         // Place readable versions of the tuple info mask into a buffer.
          // Assume that the string can not expand beyond 256.
          flagString[0] = '\0';
          if (infoMask & HEAP_HASNULL)
@@ -990,7 +992,7 @@ FormatItem (unsigned int numBytes, unsigned int startIndex,
          printf ("  infomask: 0x%04x (%s) \n", infoMask, flagString);
 
          // As t_bits is a variable length array, determine the length of
-         // the header proper  
+         // the header proper
          if (infoMask & HEAP_HASNULL)
            bitmapLength = BITMAPLEN (localNatts);
          else
@@ -1049,7 +1051,7 @@ FormatSpecial ()
       printf (" Sequence: 0x%08x\n", SEQUENCE_MAGIC);
       break;
 
-      // Btree index section  
+      // Btree index section
     case SPEC_SECT_INDEX_BTREE:
       {
        BTPageOpaque btreeSection = (BTPageOpaque) (buffer + specialOffset);
@@ -1082,7 +1084,7 @@ FormatSpecial ()
       }
       break;
 
-      // Hash index section  
+      // Hash index section
     case SPEC_SECT_INDEX_HASH:
       {
        HashPageOpaque hashSection = (HashPageOpaque) (buffer + specialOffset);
@@ -1169,6 +1171,8 @@ FormatSpecial ()
          strcat (flagString, "DELETED|");
        if (spgistSection->flags & SPGIST_LEAF)
          strcat (flagString, "LEAF|");
+       if (spgistSection->flags & SPGIST_NULLS)
+         strcat (flagString, "NULLS|");
        if (strlen (flagString))
          flagString[strlen (flagString) - 1] = '\0';
        printf (" SPGIST Index Section:\n"
@@ -1187,7 +1191,7 @@ FormatSpecial ()
       break;
     }
 
-  // Dump the formatted contents of the special section       
+  // Dump the formatted contents of the special section
   if (blockOptions & BLOCK_FORMAT)
     {
       if (specialType == SPEC_SECT_ERROR_BOUNDARY)
@@ -1212,17 +1216,17 @@ FormatBlock ()
           blockSize) ? "***************" : " PARTIAL BLOCK ");
 
   // Either dump out the entire block in hex+acsii fashion or
-  // interpret the data based on block structure 
+  // interpret the data based on block structure
   if (blockOptions & BLOCK_NO_INTR)
     FormatBinary (bytesToFormat, 0);
   else
     {
       int rc;
       // Every block contains a header, items and possibly a special
-      // section.  Beware of partial block reads though            
+      // section.  Beware of partial block reads though
       rc = FormatHeader (page);
 
-      // If we didn't encounter a partial read in the header, carry on... 
+      // If we didn't encounter a partial read in the header, carry on...
       if (rc != EOF_ENCOUNTERED)
        {
          FormatItemBlock (page);
@@ -1245,7 +1249,7 @@ FormatControl ()
   printf
     ("\n<pg_control Contents> *********************************************\n\n");
 
-  // Check the version 
+  // Check the version
   if (bytesToFormat >= offsetof (ControlFileData, catalog_version_no))
     localPgVersion = ((ControlFileData *) buffer)->pg_control_version;
 
@@ -1365,12 +1369,12 @@ FormatControl ()
              "        Size: Correct <%u>  Received <%u>.\n\n",
              controlFileSize, bytesToFormat);
 
-      // If we have an error, force a formatted dump so we can see 
+      // If we have an error, force a formatted dump so we can see
       // where things are going wrong
       controlOptions |= CONTROL_FORMAT;
     }
 
-  // Dump hex and ascii representation of data 
+  // Dump hex and ascii representation of data
   if (controlOptions & CONTROL_FORMAT)
     {
       printf ("<pg_control Formatted Dump> *****************"
@@ -1379,7 +1383,7 @@ FormatControl ()
     }
 }
 
-// Dump out the contents of the block in hex and ascii. 
+// Dump out the contents of the block in hex and ascii.
 // BYTES_PER_LINE bytes are formatted in each line.
 static void
 FormatBinary (unsigned int numBytes, unsigned int startIndex)
@@ -1392,7 +1396,7 @@ FormatBinary (unsigned int numBytes, unsigned int startIndex)
   if (numBytes)
     {
       // Iterate through a printable row detailing the current
-      // address, the hex and ascii values         
+      // address, the hex and ascii values
       for (index = startIndex; index < lastByte; index += BYTES_PER_LINE)
        {
          stopIndex = index + BYTES_PER_LINE;
@@ -1469,7 +1473,7 @@ DumpFileContents ()
       if (bytesToFormat == 0)
        {
          // fseek() won't pop an error if you seek passed eof.  The next
-         // subsequent read gets the error.    
+         // subsequent read gets the error.
          if (initialRead)
            printf ("Error: Premature end of file encountered.\n");
          else if (!(blockOptions & BLOCK_BINARY))
@@ -1516,7 +1520,7 @@ DumpFileContents ()
 int
 main (int argv, char **argc)
 {
-  // If there is a parameter list, validate the options 
+  // If there is a parameter list, validate the options
   unsigned int validOptions;
   validOptions = (argv < 2) ? OPT_RC_COPYRIGHT : ConsumeOptions (argv, argc);
 
@@ -1526,12 +1530,12 @@ main (int argv, char **argc)
     DisplayOptions (validOptions);
   else
     {
-      // Don't dump the header if we're dumping binary pages        
+      // Don't dump the header if we're dumping binary pages
       if (!(blockOptions & BLOCK_BINARY))
        CreateDumpFileHeader (argv, argc);
 
       // If the user has not forced a block size, use the size of the
-      // control file data or the information from the block 0 header 
+      // control file data or the information from the block 0 header
       if (controlOptions)
        {
          if (!(controlOptions & CONTROL_FORCED))
index b15ae25c342d45d13c82c9fd7d32e39598b36484..e044eac98ccd59da2af099ad16756abdf0708e53 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * pg_filedump.h - PostgreSQL file dump utility for dumping and
  *                 formatting heap (data), index and control files.
- * 
+ *
  * Copyright (c) 2002-2010 Red Hat, Inc.
- * Copyright (c) 2011, PostgreSQL Global Development Group
+ * Copyright (c) 2011-2012, PostgreSQL Global Development Group
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Original Author: Patrick Macdonald <patrickm@redhat.com> 
+ * Original Author: Patrick Macdonald <patrickm@redhat.com>
  */
 
 #define FD_VERSION     "9.2.0"                 /* version ID of pg_filedump */
@@ -53,14 +53,14 @@ typedef enum
 }
 blockSwitches;
 
-static int blockStart = -1;    // -R [start]: Block range start 
+static int blockStart = -1;    // -R [start]: Block range start
 static int blockEnd = -1;      // -R [end]: Block range end
 
 // Options for Item formatting operations
 static unsigned int itemOptions = 0;
 typedef enum
 {
-  ITEM_DETAIL = 0x00000001,    // -i: Display interpreted items    
+  ITEM_DETAIL = 0x00000001,    // -i: Display interpreted items
   ITEM_HEAP = 0x00000002,      // -y: Blocks contain HeapTuple items
   ITEM_INDEX = 0x00000004,     // -x: Blocks contain IndexTuple items
   ITEM_SPG_INNER = 0x00000008, // Blocks contain SpGistInnerTuple items
@@ -82,13 +82,13 @@ controlSwitches;
 typedef enum
 {
   SPEC_SECT_NONE,              // No special section on block
-  SPEC_SECT_SEQUENCE,          // Sequence info in special section 
+  SPEC_SECT_SEQUENCE,          // Sequence info in special section
   SPEC_SECT_INDEX_BTREE,       // BTree index info in special section
   SPEC_SECT_INDEX_HASH,                // Hash index info in special section
   SPEC_SECT_INDEX_GIST,                // GIST index info in special section
   SPEC_SECT_INDEX_GIN,         // GIN index info in special section
   SPEC_SECT_INDEX_SPGIST,      // SP-GIST index info in special section
-  SPEC_SECT_ERROR_UNKNOWN,     // Unknown error 
+  SPEC_SECT_ERROR_UNKNOWN,     // Unknown error
   SPEC_SECT_ERROR_BOUNDARY     // Boundary error
 }
 specialSectionTypes;
@@ -108,7 +108,7 @@ typedef enum
 optionReturnCodes;
 
 // Simple macro to check for duplicate options and then set
-// an option flag for later consumption 
+// an option flag for later consumption
 #define SET_OPTION(_x,_y,_z) if (_x & _y)               \
                                {                        \
                                  rc = OPT_RC_DUPLICATE; \