Обсуждение: Re: Disparity in search_path SHOW and SET
Greg Sabino Mullane wrote:
[ There is text before PGP section. ]
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
> > Well, sure, because you told it to. Why isn't the last parameter "false"?
>
> Thanks. I knew I was overlooking something. I've obviously been staring at
> the code too long. :) Still, would it make more sense for SHOW search_path
> to return this:
>
> "$user",public
Agreed. I have gotten confused on how to set $user in the past. I have
developed the following patch that sets the default with the double
quotes around it, and it works fine. The patch also contains updated
documentation.
I just never realized that dollar signs have to be double-quoted, but I
it makes sense now that I see it:
test=> select lanname as $user from pg_language;
ERROR: syntax error at or near "$" at character 19
LINE 1: select lanname as $user from pg_language;
^
test=> select lanname as "$user" from pg_language;
$user
----------
internal
c
sql
(3 rows)
Are the quotes an improvement?
search_path
----------------
"$user",public
(1 row)
test=> set search_path = "$user",public;
SET
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/config.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/config.sgml,v
retrieving revision 1.39
diff -c -c -r1.39 config.sgml
*** doc/src/sgml/config.sgml 20 Dec 2005 02:30:35 -0000 1.39
--- doc/src/sgml/config.sgml 22 Dec 2005 23:42:13 -0000
***************
*** 39,45 ****
# This is a comment
log_connections = yes
log_destination = 'syslog'
! search_path = '$user, public'
</programlisting>
One parameter is specified per line. The equal sign between name and
value is optional. Whitespace is insignificant and blank lines are
--- 39,45 ----
# This is a comment
log_connections = yes
log_destination = 'syslog'
! search_path = '"$user", public'
</programlisting>
One parameter is specified per line. The equal sign between name and
value is optional. Whitespace is insignificant and blank lines are
***************
*** 3117,3123 ****
<para>
The default value for this parameter is
! <literal>'$user, public'</literal> (where the second part will be
ignored if there is no schema named <literal>public</>).
This supports shared use of a database (where no users
have private schemas, and all share use of <literal>public</>),
--- 3117,3123 ----
<para>
The default value for this parameter is
! <literal>'"$user", public'</literal> (where the second part will be
ignored if there is no schema named <literal>public</>).
This supports shared use of a database (where no users
have private schemas, and all share use of <literal>public</>),
Index: doc/src/sgml/ddl.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ddl.sgml,v
retrieving revision 1.50
diff -c -c -r1.50 ddl.sgml
*** doc/src/sgml/ddl.sgml 4 Nov 2005 23:53:18 -0000 1.50
--- doc/src/sgml/ddl.sgml 22 Dec 2005 23:42:14 -0000
***************
*** 1650,1656 ****
<screen>
search_path
--------------
! $user,public
</screen>
The first element specifies that a schema with the same name as
the current user is to be searched. If no such schema exists,
--- 1650,1656 ----
<screen>
search_path
--------------
! "$user",public
</screen>
The first element specifies that a schema with the same name as
the current user is to be searched. If no such schema exists,
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.302
diff -c -c -r1.302 guc.c
*** src/backend/utils/misc/guc.c 20 Dec 2005 02:30:36 -0000 1.302
--- src/backend/utils/misc/guc.c 22 Dec 2005 23:42:17 -0000
***************
*** 1902,1908 ****
GUC_LIST_INPUT | GUC_LIST_QUOTE
},
&namespace_search_path,
! "$user,public", assign_search_path, NULL
},
{
--- 1902,1908 ----
GUC_LIST_INPUT | GUC_LIST_QUOTE
},
&namespace_search_path,
! "\"$user\",public", assign_search_path, NULL
},
{
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.171
diff -c -c -r1.171 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample 17 Nov 2005 22:14:54 -0000 1.171
--- src/backend/utils/misc/postgresql.conf.sample 22 Dec 2005 23:42:19 -0000
***************
*** 364,370 ****
# - Statement Behavior -
! #search_path = '$user,public' # schema names
#default_tablespace = '' # a tablespace name, '' uses
# the default
#check_function_bodies = on
--- 364,370 ----
# - Statement Behavior -
! #search_path = '"$user",public' # schema names
#default_tablespace = '' # a tablespace name, '' uses
# the default
#check_function_bodies = on
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Agreed. I have gotten confused on how to set $user in the past. I have
> developed the following patch that sets the default with the double
> quotes around it, and it works fine. The patch also contains updated
> documentation.
This is really entirely irrelevant to Greg's complaint. To respond to
that, you'd have to modify the behavior of SHOW.
Actually, it seems that this exposes a bug in the search_path code: if
I wrote what you wrote, I'd really expect that it refers to a schema
named exactly $user --- the quoting ought to suppress the substitution,
one would think. Not sure how hard or easy that might be to implement
though ...
regards, tom lane
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > Agreed. I have gotten confused on how to set $user in the past. I have
> > developed the following patch that sets the default with the double
> > quotes around it, and it works fine. The patch also contains updated
> > documentation.
>
> This is really entirely irrelevant to Greg's complaint. To respond to
> that, you'd have to modify the behavior of SHOW.
Uh, SHOW does show the quotes:
test=> show search_path;
search_path
----------------
"$user",public
(1 row)
and that can be fed right into SET:
test=> set search_path = "$user",public;
SET
I thought that was the goal.
> Actually, it seems that this exposes a bug in the search_path code: if
> I wrote what you wrote, I'd really expect that it refers to a schema
> named exactly $user --- the quoting ought to suppress the substitution,
> one would think. Not sure how hard or easy that might be to implement
> though ...
I am unsure if the quotes are suppose to still allow dollar expansion.
It does in shell scripts. Actually this is kind of unusual:
test=> set search_path = '$user', public;
SET
test=> show search_path;
search_path
-----------------
"$user", public
(1 row)
It converts the single quotes to double.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Uh, SHOW does show the quotes:
> test=> show search_path;
> search_path
> ----------------
> "$user",public
> (1 row)
Hmm ... you're right, it does, so the current default is actually a
value that you can't get into the variable by a normal SET.
Interesting. (We are doing the "smart" stuff during SET not SHOW,
it appears.)
regression=# show search_path ;
search_path
--------------
$user,public
(1 row)
regression=# set search_path = '$user',public;
SET
regression=# show search_path ;
search_path
-----------------
"$user", public
(1 row)
Given that, I agree with changing the default string. It should look
the same as a value that you could actually assign ...
regards, tom lane
OK, applied. I have _not_ backpatched this. --------------------------------------------------------------------------- Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Uh, SHOW does show the quotes: > > > test=> show search_path; > > search_path > > ---------------- > > "$user",public > > (1 row) > > Hmm ... you're right, it does, so the current default is actually a > value that you can't get into the variable by a normal SET. > Interesting. (We are doing the "smart" stuff during SET not SHOW, > it appears.) > > regression=# show search_path ; > search_path > -------------- > $user,public > (1 row) > > regression=# set search_path = '$user',public; > SET > regression=# show search_path ; > search_path > ----------------- > "$user", public > (1 row) > > Given that, I agree with changing the default string. It should look > the same as a value that you could actually assign ... > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 6: explain analyze is your friend > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
> Agreed. I have gotten confused on how to set $user in the past. I have > developed the following patch that sets the default with the double > quotes around it, and it works fine. The patch also contains updated > documentation. Just be careful about pg_dump's special handling of search_path in user and db variables... Make sure you haven't broken it. Chris
Christopher Kings-Lynne wrote: > > Agreed. I have gotten confused on how to set $user in the past. I have > > developed the following patch that sets the default with the double > > quotes around it, and it works fine. The patch also contains updated > > documentation. > > Just be careful about pg_dump's special handling of search_path in user > and db variables... > > Make sure you haven't broken it. Uh, could you provide a test I can do? The code is already in CVS. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073