Re: [BUGS] *.sql contrib files contain unresolvable MODULE_PATHNAME

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [BUGS] *.sql contrib files contain unresolvable MODULE_PATHNAME
Дата
Msg-id 19678.1318440987@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: [BUGS] *.sql contrib files contain unresolvable MODULE_PATHNAME  (Magnus Hagander <magnus@hagander.net>)
Ответы Re: [BUGS] *.sql contrib files contain unresolvable MODULE_PATHNAME
Re: [BUGS] *.sql contrib files contain unresolvable MODULE_PATHNAME
Список pgsql-hackers
Magnus Hagander <magnus@hagander.net> writes:
> On Wed, Oct 12, 2011 at 17:40, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> The only thing the \echo approach will cost us is a few more lines of C
>> code in execute_extension_script(), and I think it's more than worth
>> that given the evident scope of the problem.

> +1.

PFA, a sample patch for this --- I've only bothered to change one script
file here, but will of course do the rest if there are no further
objections.  The technique actually works even better than I expected,
because of the seemingly nowhere documented fact that \quit in a script
file doesn't terminate psql, only processing of the script.  So what
I get is

regression=# \i ~/postgres/share/extension/cube--1.0.sql
Use "CREATE EXTENSION cube" to load this file.
regression=#

which is about as good as one could hope for.

(Looks like a patch to the psql docs is upcoming, too.)

            regards, tom lane


diff --git a/contrib/cube/cube--1.0.sql b/contrib/cube/cube--1.0.sql
index ee9febe005315bf13e93a9ef216a7411fc13a445..0d259c0969d9df4a00f160bf1fc00407273e2b1d 100644
*** a/contrib/cube/cube--1.0.sql
--- b/contrib/cube/cube--1.0.sql
***************
*** 1,5 ****
--- 1,7 ----
  /* contrib/cube/cube--1.0.sql */

+ \echo Use "CREATE EXTENSION cube" to load this file. \quit
+
  -- Create the user-defined type for N-dimensional boxes

  CREATE FUNCTION cube_in(cstring)
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 3af15dd38bb7044ec6f733787cad6897b204ccd3..ba1e2c45cd97c89265912d338a98f52bf48ea4b0 100644
*** a/src/backend/commands/extension.c
--- b/src/backend/commands/extension.c
***************
*** 33,38 ****
--- 33,39 ----
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
  #include "catalog/objectaccess.h"
+ #include "catalog/pg_collation.h"
  #include "catalog/pg_depend.h"
  #include "catalog/pg_extension.h"
  #include "catalog/pg_namespace.h"
*************** execute_extension_script(Oid extensionOi
*** 855,880 ****
      CurrentExtensionObject = extensionOid;
      PG_TRY();
      {
!         char       *sql = read_extension_script_file(control, filename);

          /*
           * If it's not relocatable, substitute the target schema name for
           * occcurrences of @extschema@.
           *
!          * For a relocatable extension, we just run the script as-is. There
!          * cannot be any need for @extschema@, else it wouldn't be
!          * relocatable.
           */
          if (!control->relocatable)
          {
              const char *qSchemaName = quote_identifier(schemaName);

!             sql = text_to_cstring(
!                                   DatumGetTextPP(
!                                             DirectFunctionCall3(replace_text,
!                                                     CStringGetTextDatum(sql),
!                                           CStringGetTextDatum("@extschema@"),
!                                          CStringGetTextDatum(qSchemaName))));
          }

          /*
--- 856,894 ----
      CurrentExtensionObject = extensionOid;
      PG_TRY();
      {
!         char       *c_sql = read_extension_script_file(control, filename);
!         Datum        t_sql;
!
!         /* We use various functions that want to operate on text datums */
!         t_sql = CStringGetTextDatum(c_sql);
!
!         /*
!          * Reduce any lines beginning with "\echo" to empty.  This allows
!          * scripts to contain messages telling people not to run them via
!          * psql, which has been found to be necessary due to old habits.
!          */
!         t_sql = DirectFunctionCall4Coll(textregexreplace,
!                                         C_COLLATION_OID,
!                                         t_sql,
!                                         CStringGetTextDatum("^\\\\echo.*$"),
!                                         CStringGetTextDatum(""),
!                                         CStringGetTextDatum("ng"));

          /*
           * If it's not relocatable, substitute the target schema name for
           * occcurrences of @extschema@.
           *
!          * For a relocatable extension, we needn't do this.  There cannot be
!          * any need for @extschema@, else it wouldn't be relocatable.
           */
          if (!control->relocatable)
          {
              const char *qSchemaName = quote_identifier(schemaName);

!             t_sql = DirectFunctionCall3(replace_text,
!                                         t_sql,
!                                         CStringGetTextDatum("@extschema@"),
!                                         CStringGetTextDatum(qSchemaName));
          }

          /*
*************** execute_extension_script(Oid extensionOi
*** 883,897 ****
           */
          if (control->module_pathname)
          {
!             sql = text_to_cstring(
!                                   DatumGetTextPP(
!                                             DirectFunctionCall3(replace_text,
!                                                     CStringGetTextDatum(sql),
!                                       CStringGetTextDatum("MODULE_PATHNAME"),
!                             CStringGetTextDatum(control->module_pathname))));
          }

!         execute_sql_string(sql, filename);
      }
      PG_CATCH();
      {
--- 897,912 ----
           */
          if (control->module_pathname)
          {
!             t_sql = DirectFunctionCall3(replace_text,
!                                         t_sql,
!                                         CStringGetTextDatum("MODULE_PATHNAME"),
!                             CStringGetTextDatum(control->module_pathname));
          }

!         /* And now back to C string */
!         c_sql = text_to_cstring(DatumGetTextPP(t_sql));
!
!         execute_sql_string(c_sql, filename);
      }
      PG_CATCH();
      {

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Magnus Hagander
Дата:
Сообщение: Re: pg_ctl restart - behaviour based on wrong instance
Следующее
От: Bruce Momjian
Дата:
Сообщение: Re: pg_ctl restart - behaviour based on wrong instance