]> granicus.if.org Git - postgresql/commitdiff
Add new pgbench options, --tablespace and --index-tablespace.
authorRobert Haas <rhaas@postgresql.org>
Mon, 25 Jul 2011 13:16:14 +0000 (09:16 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 25 Jul 2011 13:16:14 +0000 (09:16 -0400)
Per a request from Greg Smith.

contrib/pgbench/pgbench.c
doc/src/sgml/pgbench.sgml

index dcae03e999632029c0fc34ebf4b6d95130bb680e..9892f4c3bbcf8e770aa62d5201790f503ddb3332 100644 (file)
@@ -124,6 +124,12 @@ int                        fillfactor = 100;
  */
 int                    unlogged_tables = 0;
 
+/*
+ * tablespace selection
+ */
+char      *tablespace = NULL;
+char      *index_tablespace = NULL;
+
 /*
  * end of configurable parameters
  *********************************************************************/
@@ -359,6 +365,10 @@ usage(const char *progname)
                   "  -h HOSTNAME  database server host or socket directory\n"
                   "  -p PORT      database server port number\n"
                   "  -U USERNAME  connect as specified database user\n"
+                  "  --index-tablespace=TABLESPACE\n"
+                  "               create indexes in the specified tablespace\n"
+                  "  --tablespace=TABLESPACE\n"
+                  "               create tables in the specified tablespace\n"
                   "  --unlogged-tables\n"
                   "               create tables as unlogged tables\n"
                   "  --help       show this help, then exit\n"
@@ -1237,15 +1247,32 @@ init(void)
         * versions.  Since pgbench has never pretended to be fully TPC-B
         * compliant anyway, we stick with the historical behavior.
         */
-       static char *DDLs[] = {
-               "drop table if exists pgbench_branches",
-               "create table pgbench_branches(bid int not null,bbalance int,filler char(88)) with (fillfactor=%d)",
-               "drop table if exists pgbench_tellers",
-               "create table pgbench_tellers(tid int not null,bid int,tbalance int,filler char(84)) with (fillfactor=%d)",
-               "drop table if exists pgbench_accounts",
-               "create table pgbench_accounts(aid int not null,bid int,abalance int,filler char(84)) with (fillfactor=%d)",
-               "drop table if exists pgbench_history",
-               "create table pgbench_history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))"
+       struct ddlinfo {
+               char *table;
+               char *cols;
+               int declare_fillfactor;
+       };
+       struct ddlinfo DDLs[] = {
+               {
+                       "pgbench_branches",
+                       "bid int not null,bbalance int,filler char(88)",
+                       1
+               },
+               {
+                       "pgbench_tellers",
+                       "tid int not null,bid int,tbalance int,filler char(84)",
+                       1
+               },
+               {
+                       "pgbench_accounts",
+                       "aid int not null,bid int,abalance int,filler char(84)",
+                       1
+               },
+               {
+                       "pgbench_history",
+                       "tid int,bid int,aid int,delta int,mtime timestamp,filler char(22)",
+                       0
+               }
        };
        static char *DDLAFTERs[] = {
                "alter table pgbench_branches add primary key (bid)",
@@ -1263,31 +1290,33 @@ init(void)
 
        for (i = 0; i < lengthof(DDLs); i++)
        {
-               char            buffer1[128];
-               char            buffer2[128];
-               char       *qry = DDLs[i];
+               char            opts[256];
+               char            buffer[256];
+               struct ddlinfo *ddl = &DDLs[i];
 
-               /*
-                * set fillfactor for branches, tellers and accounts tables
-                */
-               if ((strstr(qry, "create table pgbench_branches") == DDLs[i]) ||
-                       (strstr(qry, "create table pgbench_tellers") == DDLs[i]) ||
-                       (strstr(qry, "create table pgbench_accounts") == DDLs[i]))
-               {
-                       snprintf(buffer1, 128, qry, fillfactor);
-                       qry = buffer1;
-               }
+               /* Remove old table, if it exists. */
+               snprintf(buffer, 256, "drop table if exists %s", ddl->table);
+               executeStatement(con, buffer);
 
-               /*
-                * set unlogged tables, if requested
-                */
-               if (unlogged_tables && strncmp(qry, "create table", 12) == 0)
+               /* Construct new create table statement. */
+               opts[0] = '\0';
+               if (ddl->declare_fillfactor)
+                       snprintf(opts+strlen(opts), 256-strlen(opts),
+                               " with (fillfactor=%d)", fillfactor);
+               if (tablespace != NULL)
                {
-                       snprintf(buffer2, 128, "create unlogged%s", qry + 6);
-                       qry = buffer2;
+                       char *escape_tablespace;
+                       escape_tablespace = PQescapeIdentifier(con, tablespace,
+                                                                                                  strlen(tablespace));
+                       snprintf(opts+strlen(opts), 256-strlen(opts),
+                               " tablespace %s", escape_tablespace);
+                       PQfreemem(escape_tablespace);
                }
+               snprintf(buffer, 256, "create%s table %s(%s)%s",
+                                unlogged_tables ? " unlogged" : "",
+                                ddl->table, ddl->cols, opts);
 
-               executeStatement(con, qry);
+               executeStatement(con, buffer);
        }
 
        executeStatement(con, "begin");
@@ -1354,7 +1383,23 @@ init(void)
         */
        fprintf(stderr, "set primary key...\n");
        for (i = 0; i < lengthof(DDLAFTERs); i++)
-               executeStatement(con, DDLAFTERs[i]);
+       {
+               char    buffer[256];
+
+               strncpy(buffer, DDLAFTERs[i], 256);
+
+               if (index_tablespace != NULL)
+               {
+                       char *escape_tablespace;
+                       escape_tablespace = PQescapeIdentifier(con, index_tablespace,
+                                                                                                  strlen(index_tablespace));
+                       snprintf(buffer+strlen(buffer), 256-strlen(buffer),
+                               " using index tablespace %s", escape_tablespace);
+                       PQfreemem(escape_tablespace);
+               }
+
+               executeStatement(con, buffer);
+       }
 
        /* vacuum */
        fprintf(stderr, "vacuum...");
@@ -1796,6 +1841,8 @@ main(int argc, char **argv)
        int                     i;
 
        static struct option long_options[] = {
+                       {"index-tablespace", required_argument, NULL, 3},
+                       {"tablespace", required_argument, NULL, 2},
                        {"unlogged-tables", no_argument, &unlogged_tables, 1},
                        {NULL, 0, NULL, 0}
        };
@@ -1996,7 +2043,13 @@ main(int argc, char **argv)
                                }
                                break;
                        case 0:
-                               /* This covers the long options. */
+                               /* This covers long options which take no argument. */
+                               break;
+                       case 2:                                                 /* tablespace */
+                               tablespace = optarg;
+                               break;
+                       case 3:                                                 /* index-tablespace */
+                               index_tablespace = optarg;
                                break;
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
index c1e5c9c7b6fb265b11e1135b4a89b813aa86d6f7..2ae3b9e317f3dbbc9d6ae9410e239fad03206a18 100644 (file)
@@ -159,6 +159,26 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--index-tablespace=<replaceable>index_tablespace</replaceable></option></term>
+      <listitem>
+       <para>
+        Create indexes in the specified tablespace, rather than the default
+        tablespace.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><option>--tablespace=<replaceable>tablespace</replaceable></option></term>
+      <listitem>
+       <para>
+        Create tables in the specified tablespace, rather than the default
+        tablespace.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--unlogged-tables</option></term>
       <listitem>