Thread: Warning about LISTEN names

Warning about LISTEN names

From
"Greg Sabino Mullane"
Date:
I'll save the full rant for my blog :), but wanted to submit this documentation
patch for this listen gotcha that's been bugging me for a while. I'd like
to see LISTEN and NOTIFY changed to use a simple text string, but until then,
I think we should probably warn about the chopping off of the left-hand part.


Index: listen.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/listen.sgml,v
retrieving revision 1.22
diff -c -r1.22 listen.sgml
*** listen.sgml 16 Sep 2006 00:30:19 -0000      1.22
--- listen.sgml 20 Feb 2007 18:18:15 -0000
***************
*** 33,38 ****
--- 33,44 ----
     class="PARAMETER">name</replaceable>.
     If the current session is already registered as a listener for
     this notification condition, nothing is done.
+    Note that because <replaceable class="PARAMETER">name</replaceable>
+    is a relation name, all but the last section will be dropped if the
+    name has any dots in it: LISTEN employee, LISTEN newyork.employee,
+    and LISTEN unitedstates.newyork.employee all register the name
+    employee. Users needing to separate words should use an underscore
+    instead of a dot.
    </para>

    <para>



Re: Warning about LISTEN names

From
Tom Lane
Date:
"Greg Sabino Mullane" <greg@turnstep.com> writes:
> I'll save the full rant for my blog :), but wanted to submit this documentation
> patch for this listen gotcha that's been bugging me for a while. I'd like
> to see LISTEN and NOTIFY changed to use a simple text string, but until then,
> I think we should probably warn about the chopping off of the left-hand part.

Let's change it to a plain ColId, so you get a syntax error if you try
that.

            regards, tom lane

Re: Warning about LISTEN names

From
"Neil Conway"
Date:
Greg Sabino Mullane said:
> I'll save the full rant for my blog :), but wanted to submit this
> documentation patch for this listen gotcha that's been bugging me
> for a while.

Why not just change LISTEN, NOTIFY, and UNLISTEN to only accept an unqualified
identifier?

-Neil



Re: Warning about LISTEN names

From
Andrew Dunstan
Date:
Tom Lane wrote:
> "Greg Sabino Mullane" <greg@turnstep.com> writes:
>
>> I'll save the full rant for my blog :), but wanted to submit this documentation
>> patch for this listen gotcha that's been bugging me for a while. I'd like
>> to see LISTEN and NOTIFY changed to use a simple text string, but until then,
>> I think we should probably warn about the chopping off of the left-hand part.
>>
>
> Let's change it to a plain ColId, so you get a syntax error if you try
> that.
>
>
>

Makes sense.

I'm still going to try to get notification payloads done for 8.3, which
will remove any requirement of catalog support and do it all in shared
memory.

Should we perhaps support a variant that allows a string as opposed to
an identifier as the name?

  LISTEN
'really_really_really_really_really_really_really_really_really_really_really_really_long_name'
;

Or is that just silly? ;-)

cheers

andrew


Re: Warning about LISTEN names

From
Tom Lane
Date:
Andrew Dunstan <andrew@dunslane.net> writes:
> Tom Lane wrote:
>> Let's change it to a plain ColId, so you get a syntax error if you try
>> that.

> Should we perhaps support a variant that allows a string as opposed to
> an identifier as the name?

I think that'd just confuse matters.  You can double-quote a string that
you want to use that isn't otherwise a valid identifier.

            regards, tom lane

Re: Warning about LISTEN names

From
Bruce Momjian
Date:
Tom Lane wrote:
> "Greg Sabino Mullane" <greg@turnstep.com> writes:
> > I'll save the full rant for my blog :), but wanted to submit this documentation
> > patch for this listen gotcha that's been bugging me for a while. I'd like
> > to see LISTEN and NOTIFY changed to use a simple text string, but until then,
> > I think we should probably warn about the chopping off of the left-hand part.
>
> Let's change it to a plain ColId, so you get a syntax error if you try
> that.

OK, so should I make this change for 8.3?

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

Re: Warning about LISTEN names

From
Bruce Momjian
Date:
Tom Lane wrote:
> "Greg Sabino Mullane" <greg@turnstep.com> writes:
> > I'll save the full rant for my blog :), but wanted to submit this documentation
> > patch for this listen gotcha that's been bugging me for a while. I'd like
> > to see LISTEN and NOTIFY changed to use a simple text string, but until then,
> > I think we should probably warn about the chopping off of the left-hand part.
>
> Let's change it to a plain ColId, so you get a syntax error if you try
> that.

With no comment from my question of status, I have implemented this
idea.  Patch attached and applied.

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.585
diff -c -c -r2.585 gram.y
*** src/backend/parser/gram.y    2 Apr 2007 03:49:38 -0000    2.585
--- src/backend/parser/gram.y    2 Apr 2007 21:57:48 -0000
***************
*** 4834,4860 ****
   *
   *****************************************************************************/

! NotifyStmt: NOTIFY qualified_name
                  {
                      NotifyStmt *n = makeNode(NotifyStmt);
!                     n->relation = $2;
                      $$ = (Node *)n;
                  }
          ;

! ListenStmt: LISTEN qualified_name
                  {
                      ListenStmt *n = makeNode(ListenStmt);
!                     n->relation = $2;
                      $$ = (Node *)n;
                  }
          ;

  UnlistenStmt:
!             UNLISTEN qualified_name
                  {
                      UnlistenStmt *n = makeNode(UnlistenStmt);
!                     n->relation = $2;
                      $$ = (Node *)n;
                  }
              | UNLISTEN '*'
--- 4834,4866 ----
   *
   *****************************************************************************/

! NotifyStmt: NOTIFY ColId
                  {
                      NotifyStmt *n = makeNode(NotifyStmt);
!                     n->relation = makeNode(RangeVar);
!                     n->relation->relname = $2;
!                     n->relation->schemaname = NULL;
                      $$ = (Node *)n;
                  }
          ;

! ListenStmt: LISTEN ColId
                  {
                      ListenStmt *n = makeNode(ListenStmt);
!                     n->relation = makeNode(RangeVar);
!                     n->relation->relname = $2;
!                     n->relation->schemaname = NULL;
                      $$ = (Node *)n;
                  }
          ;

  UnlistenStmt:
!             UNLISTEN ColId
                  {
                      UnlistenStmt *n = makeNode(UnlistenStmt);
!                     n->relation = makeNode(RangeVar);
!                     n->relation->relname = $2;
!                     n->relation->schemaname = NULL;
                      $$ = (Node *)n;
                  }
              | UNLISTEN '*'