Thread: default database creation with initdb

default database creation with initdb

From
Andreas Pflug
Date:
As per discussion on -hackers the attached patch creates the 'default'
database at initdb time as a default target for initial connections to
keep template1 free from connections and available as template source.

I consider this DB a system object, so it's created before
make_template0 sets the last_system_oid (wondering why template0 isn't
considered a system db too)

Regards,
Andreas
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.83
diff -u -r1.83 initdb.c
--- src/bin/initdb/initdb.c    30 Apr 2005 08:08:51 -0000    1.83
+++ src/bin/initdb/initdb.c    18 Jun 2005 08:37:16 -0000
@@ -177,6 +177,7 @@
 static void set_info_version(void);
 static void setup_schema(void);
 static void vacuum_db(void);
+static void make_default(void);
 static void make_template0(void);
 static void trapsig(int signum);
 static void check_ok(void);
@@ -1828,6 +1829,38 @@
 }

 /*
+ * copy template1 to pg_system
+ */
+static void
+make_default(void)
+{
+    PG_CMD_DECL;
+    char      **line;
+    static char *pg_system_setup[] = {
+        "CREATE DATABASE \"default\";\n",
+        "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",
+        NULL
+    };
+
+    fputs(_("copying template1 to default ... "), stdout);
+    fflush(stdout);
+
+    snprintf(cmd, sizeof(cmd),
+             "\"%s\" %s template1 >%s",
+             backend_exec, backend_options,
+             DEVNULL);
+
+    PG_CMD_OPEN;
+
+    for (line = pg_system_setup; *line; line++)
+        PG_CMD_PUTS(*line);
+
+    PG_CMD_CLOSE;
+
+    check_ok();
+}
+
+/*
  * copy template1 to template0
  */
 static void
@@ -2606,6 +2639,8 @@

     vacuum_db();

+    make_default();
+
     make_template0();

     if (authwarning != NULL)

Re: default database creation with initdb

From
"Magnus Hagander"
Date:
Umm. Tiny item, but your comment still refers to the database as
pg_system ;-)

//Magnus

> -----Original Message-----
> From: pgsql-patches-owner@postgresql.org
> [mailto:pgsql-patches-owner@postgresql.org] On Behalf Of Andreas Pflug
> Sent: Saturday, June 18, 2005 10:42 AM
> To: PostgreSQL-patches
> Subject: [PATCHES] default database creation with initdb
>
> As per discussion on -hackers the attached patch creates the
> 'default'
> database at initdb time as a default target for initial
> connections to keep template1 free from connections and
> available as template source.
>
> I consider this DB a system object, so it's created before
> make_template0 sets the last_system_oid (wondering why
> template0 isn't considered a system db too)
>
> Regards,
> Andreas
>

Re: default database creation with initdb

From
Andreas Pflug
Date:
Magnus Hagander wrote:
> Umm. Tiny item, but your comment still refers to the database as
> pg_system ;-)

:-)

Regards,
Andreas
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.83
diff -u -r1.83 initdb.c
--- src/bin/initdb/initdb.c    30 Apr 2005 08:08:51 -0000    1.83
+++ src/bin/initdb/initdb.c    18 Jun 2005 08:54:07 -0000
@@ -177,6 +177,7 @@
 static void set_info_version(void);
 static void setup_schema(void);
 static void vacuum_db(void);
+static void make_default(void);
 static void make_template0(void);
 static void trapsig(int signum);
 static void check_ok(void);
@@ -1828,6 +1829,38 @@
 }

 /*
+ * copy template1 to default
+ */
+static void
+make_default(void)
+{
+    PG_CMD_DECL;
+    char      **line;
+    static char *default_setup[] = {
+        "CREATE DATABASE \"default\";\n",
+        "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",
+        NULL
+    };
+
+    fputs(_("copying template1 to default ... "), stdout);
+    fflush(stdout);
+
+    snprintf(cmd, sizeof(cmd),
+             "\"%s\" %s template1 >%s",
+             backend_exec, backend_options,
+             DEVNULL);
+
+    PG_CMD_OPEN;
+
+    for (line = default_setup; *line; line++)
+        PG_CMD_PUTS(*line);
+
+    PG_CMD_CLOSE;
+
+    check_ok();
+}
+
+/*
  * copy template1 to template0
  */
 static void
@@ -2606,6 +2639,8 @@

     vacuum_db();

+    make_default();
+
     make_template0();

     if (authwarning != NULL)

Re: default database creation with initdb

From
Robert Treat
Date:
On Saturday 18 June 2005 04:55, Andreas Pflug wrote:
> Magnus Hagander wrote:
> > Umm. Tiny item, but your comment still refers to the database as
> > pg_system ;-)
> >

What is the purpose of this database? A generalized, shared resource for tool
makers and add-on packages to store information in PostgreSQL, or a working
database that is usable (and to be used) out of the box for new users?  I
really don't think we want the latter... I can see users connecting via psql
and then playing around with different add/create type statements.  It is all
too common a question from newbies... "does postgresql have a default
database to get started with?" They'll see this database and begin creating
schema and using this as thier main database, and I think we ought to avoid
that. If people don't like pg_system, pg_addons seem like a much safer name
to go with imho.

--
Robert Treat
Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL

Re: default database creation with initdb

From
Tom Lane
Date:
Andreas Pflug <pgadmin@pse-consulting.de> writes:
> +        "CREATE DATABASE \"default\";\n",
> +        "REVOKE CREATE,TEMPORARY ON DATABASE \"default\" FROM public;\n",

Uh, why the rights revocation?  That makes the thing essentially useless
... except to superusers, who will not be affected anyway.  I don't
think this is a sane default.

In any case, fixing initdb for this is trivial.  I count something north
of 160 other references to template1 in the current sources, scattered
across 60+ files.  Every one of those has to be looked at and possibly
changed.

            regards, tom lane

Re: default database creation with initdb

From
Andreas Pflug
Date:
Robert Treat wrote:

>On Saturday 18 June 2005 04:55, Andreas Pflug wrote:
>
>
>>Magnus Hagander wrote:
>>
>>
>>>Umm. Tiny item, but your comment still refers to the database as
>>>pg_system ;-)
>>>
>>>
>>>
>
>What is the purpose of this database? A generalized, shared resource for tool
>makers and add-on packages to store information in PostgreSQL, or a working
>database that is usable (and to be used) out of the box for new users?  I
>really don't think we want the latter... I can see users connecting via psql
>and then playing around with different add/create type statements.  It is all
>too common a question from newbies... "does postgresql have a default
>database to get started with?"
>
A sample DB would be nice...

> They'll see this database and begin creating
>schema and using this as thier main database, and I think we ought to avoid
>that. If people don't like pg_system, pg_addons seem like a much safer name
>to go with imho.
>
>

To avoid people creating stuff in it, the patch revokes CREATE from
public (won't help against admins),
which in turn Tom thinks is "not a sane default".

Regards,
Andreas


Re: default database creation with initdb

From
Bruno Wolff III
Date:
On Sat, Jun 18, 2005 at 09:27:49 -0400,
  Robert Treat <xzilla@users.sourceforge.net> wrote:
> On Saturday 18 June 2005 04:55, Andreas Pflug wrote:
> > Magnus Hagander wrote:
> > > Umm. Tiny item, but your comment still refers to the database as
> > > pg_system ;-)
> > >
>
> What is the purpose of this database? A generalized, shared resource for tool
> makers and add-on packages to store information in PostgreSQL, or a working
> database that is usable (and to be used) out of the box for new users?  I
> really don't think we want the latter... I can see users connecting via psql
> and then playing around with different add/create type statements.  It is all
> too common a question from newbies... "does postgresql have a default
> database to get started with?" They'll see this database and begin creating
> schema and using this as thier main database, and I think we ought to avoid
> that. If people don't like pg_system, pg_addons seem like a much safer name
> to go with imho.

I believe the intention is that things that need to connect to some
database to do their work (e.g. psql -l, createuser) will connect to that
database. createdb will still connect to template1, but now will be less
likely to have a conflict with another user being connected to template1
at the same time. I didn't check the patch to see if the behavior of the
psql -l and createuser were changed or if just the initdb behavior was
changed.

I don't think it will be a big deal if people put stuff in that database.