Re: PostgreSQL Upgrade Procedure

Поиск
Список
Период
Сортировка
От Thomas Lockhart
Тема Re: PostgreSQL Upgrade Procedure
Дата
Msg-id 37EB90C2.6935454A@alumni.caltech.edu
обсуждение исходный текст
Список pgsql-hackers
> > > There is a parser bug someone introduced recently which we will fix
> > > for v6.5.3, but I can give you a patch file for this on v6.5.2. I'll
> > > develop it in the next couple of days.
> > Is it a showstopper??  Send the patch anyway, of course.

"showstopper" in the sense that it was not in v6.5.1? Apparently not.
But it causes a couple of math operators to not be recognized as
operators in some situations (like when defining a new operator :/

Here is a patch. *Not* tested under v6.5.1 or .2, but *all* of the
changes were tested under the current development tree. Since it
patches gram.y, it will cause gram.c to be rebuilt, which we usually
try to avoid but only because not everyone has bison/flex installed.
That isn't the case for your RH system.

                      - Thomas

--
Thomas Lockhart                lockhart@alumni.caltech.edu
South Pasadena, California*** gram.y.orig    Thu Sep 23 16:30:59 1999
--- gram.y    Fri Sep 24 14:42:53 1999
***************
*** 221,227 ****
                  having_clause
  %type <list>    row_descriptor, row_list, c_list, c_expr
  %type <node>    row_expr
- %type <str>        row_op
  %type <node>    case_expr, case_arg, when_clause, case_default
  %type <list>    when_clause_list
  %type <ival>    sub_type
--- 221,226 ----
***************
*** 970,981 ****
                  {    $$ = nconc( $1, lcons( makeString( "-"), $3)); }
              | default_expr '/' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "/"), $3)); }
-             | default_expr '%' default_expr
-                 {    $$ = nconc( $1, lcons( makeString( "%"), $3)); }
              | default_expr '*' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "*"), $3)); }
              | default_expr '^' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "^"), $3)); }
              | default_expr '=' default_expr
                  {    elog(ERROR,"boolean expressions not supported in DEFAULT"); }
              | default_expr '<' default_expr
--- 969,982 ----
                  {    $$ = nconc( $1, lcons( makeString( "-"), $3)); }
              | default_expr '/' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "/"), $3)); }
              | default_expr '*' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "*"), $3)); }
+             | default_expr '%' default_expr
+                 {    $$ = nconc( $1, lcons( makeString( "%"), $3)); }
              | default_expr '^' default_expr
                  {    $$ = nconc( $1, lcons( makeString( "^"), $3)); }
+             | default_expr '|' default_expr
+                 {    $$ = nconc( $1, lcons( makeString( "|"), $3)); }
              | default_expr '=' default_expr
                  {    elog(ERROR,"boolean expressions not supported in DEFAULT"); }
              | default_expr '<' default_expr
***************
*** 1120,1131 ****
                  {    $$ = nconc( $1, lcons( makeString( "-"), $3)); }
              | constraint_expr '/' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "/"), $3)); }
-             | constraint_expr '%' constraint_expr
-                 {    $$ = nconc( $1, lcons( makeString( "%"), $3)); }
              | constraint_expr '*' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "*"), $3)); }
              | constraint_expr '^' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "^"), $3)); }
              | constraint_expr '=' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "="), $3)); }
              | constraint_expr '<' constraint_expr
--- 1121,1134 ----
                  {    $$ = nconc( $1, lcons( makeString( "-"), $3)); }
              | constraint_expr '/' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "/"), $3)); }
              | constraint_expr '*' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "*"), $3)); }
+             | constraint_expr '%' constraint_expr
+                 {    $$ = nconc( $1, lcons( makeString( "%"), $3)); }
              | constraint_expr '^' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "^"), $3)); }
+             | constraint_expr '|' constraint_expr
+                 {    $$ = nconc( $1, lcons( makeString( "|"), $3)); }
              | constraint_expr '=' constraint_expr
                  {    $$ = nconc( $1, lcons( makeString( "="), $3)); }
              | constraint_expr '<' constraint_expr
***************
*** 2016,2028 ****

  all_Op:  Op | MathOp;

! MathOp:    '+'                { $$ = "+"; }
          | '-'            { $$ = "-"; }
          | '*'            { $$ = "*"; }
          | '/'            { $$ = "/"; }
-         | '%'            { $$ = "%"; }
          | '<'            { $$ = "<"; }
          | '>'            { $$ = ">"; }
          | '='            { $$ = "="; }
          ;

--- 2019,2033 ----

  all_Op:  Op | MathOp;

! MathOp:  '+'            { $$ = "+"; }
          | '-'            { $$ = "-"; }
          | '*'            { $$ = "*"; }
          | '/'            { $$ = "/"; }
          | '<'            { $$ = "<"; }
          | '>'            { $$ = ">"; }
+         | '%'            { $$ = "%"; }
+         | '^'            { $$ = "^"; }
+         | '|'            { $$ = "|"; }
          | '='            { $$ = "="; }
          ;

***************
*** 3528,3534 ****
  /* Expressions using row descriptors
   * Define row_descriptor to allow yacc to break the reduce/reduce conflict
   *  with singleton expressions.
!  * Eliminated lots of code by defining row_op and sub_type clauses.
   * However, can not consolidate EXPR_LINK case with others subselects
   *  due to shift/reduce conflict with the non-subselect clause (the parser
   *  would have to look ahead more than one token to resolve the conflict).
--- 3533,3539 ----
  /* Expressions using row descriptors
   * Define row_descriptor to allow yacc to break the reduce/reduce conflict
   *  with singleton expressions.
!  * Eliminated lots of code by defining sub_type clauses.
   * However, can not consolidate EXPR_LINK case with others subselects
   *  due to shift/reduce conflict with the non-subselect clause (the parser
   *  would have to look ahead more than one token to resolve the conflict).
***************
*** 3554,3560 ****
                      n->subselect = $7;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' row_op sub_type '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = $2;
--- 3559,3565 ----
                      n->subselect = $7;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' all_Op sub_type '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = $2;
***************
*** 3567,3573 ****
                      n->subselect = $7;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' row_op '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = $2;
--- 3572,3578 ----
                      n->subselect = $7;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' all_Op '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = $2;
***************
*** 3580,3586 ****
                      n->subselect = $6;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' row_op '(' row_descriptor ')'
                  {
                      $$ = makeRowExpr($4, $2, $6);
                  }
--- 3585,3591 ----
                      n->subselect = $6;
                      $$ = (Node *)n;
                  }
!         | '(' row_descriptor ')' all_Op '(' row_descriptor ')'
                  {
                      $$ = makeRowExpr($4, $2, $6);
                  }
***************
*** 3602,3618 ****
                  }
          ;

- row_op:  Op                                    { $$ = $1; }
-         | '<'                                { $$ = "<"; }
-         | '='                                { $$ = "="; }
-         | '>'                                { $$ = ">"; }
-         | '+'                                { $$ = "+"; }
-         | '-'                                { $$ = "-"; }
-         | '*'                                { $$ = "*"; }
-         | '/'                                { $$ = "/"; }
-         | '%'                                { $$ = "%"; }
-         ;
-
  sub_type:  ANY                                { $$ = ANY_SUBLINK; }
          | ALL                                { $$ = ALL_SUBLINK; }
          ;
--- 3607,3612 ----
***************
*** 3658,3669 ****
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | a_expr '/' a_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
-         | a_expr '%' a_expr
-                 {    $$ = makeA_Expr(OP, "%", $1, $3); }
          | a_expr '*' a_expr
                  {    $$ = makeA_Expr(OP, "*", $1, $3); }
          | a_expr '^' a_expr
                  {    $$ = makeA_Expr(OP, "^", $1, $3); }
          | a_expr '<' a_expr
                  {    $$ = makeA_Expr(OP, "<", $1, $3); }
          | a_expr '>' a_expr
--- 3652,3665 ----
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | a_expr '/' a_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
          | a_expr '*' a_expr
                  {    $$ = makeA_Expr(OP, "*", $1, $3); }
+         | a_expr '%' a_expr
+                 {    $$ = makeA_Expr(OP, "%", $1, $3); }
          | a_expr '^' a_expr
                  {    $$ = makeA_Expr(OP, "^", $1, $3); }
+         | a_expr '|' a_expr
+                 {    $$ = makeA_Expr(OP, "|", $1, $3); }
          | a_expr '<' a_expr
                  {    $$ = makeA_Expr(OP, "<", $1, $3); }
          | a_expr '>' a_expr
***************
*** 4049,4054 ****
--- 4045,4060 ----
                      n->subselect = $4;
                      $$ = (Node *)n;
                  }
+         | a_expr '*' '(' SubSelect ')'
+                 {
+                     SubLink *n = makeNode(SubLink);
+                     n->lefthand = lcons($1, NULL);
+                     n->oper = lcons("*",NIL);
+                     n->useor = false;
+                     n->subLinkType = EXPR_SUBLINK;
+                     n->subselect = $4;
+                     $$ = (Node *)n;
+                 }
          | a_expr '%' '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
***************
*** 4059,4069 ****
                      n->subselect = $4;
                      $$ = (Node *)n;
                  }
!         | a_expr '*' '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("*",NIL);
                      n->useor = false;
                      n->subLinkType = EXPR_SUBLINK;
                      n->subselect = $4;
--- 4065,4085 ----
                      n->subselect = $4;
                      $$ = (Node *)n;
                  }
!         | a_expr '^' '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("^",NIL);
!                     n->useor = false;
!                     n->subLinkType = EXPR_SUBLINK;
!                     n->subselect = $4;
!                     $$ = (Node *)n;
!                 }
!         | a_expr '|' '(' SubSelect ')'
!                 {
!                     SubLink *n = makeNode(SubLink);
!                     n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("|",NIL);
                      n->useor = false;
                      n->subLinkType = EXPR_SUBLINK;
                      n->subselect = $4;
***************
*** 4139,4144 ****
--- 4155,4170 ----
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
+         | a_expr '*' ANY '(' SubSelect ')'
+                 {
+                     SubLink *n = makeNode(SubLink);
+                     n->lefthand = lcons($1,NIL);
+                     n->oper = lcons("*",NIL);
+                     n->useor = false;
+                     n->subLinkType = ANY_SUBLINK;
+                     n->subselect = $5;
+                     $$ = (Node *)n;
+                 }
          | a_expr '%' ANY '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
***************
*** 4149,4159 ****
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
!         | a_expr '*' ANY '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1,NIL);
!                     n->oper = lcons("*",NIL);
                      n->useor = false;
                      n->subLinkType = ANY_SUBLINK;
                      n->subselect = $5;
--- 4175,4195 ----
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
!         | a_expr '^' ANY '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1,NIL);
!                     n->oper = lcons("^",NIL);
!                     n->useor = false;
!                     n->subLinkType = ANY_SUBLINK;
!                     n->subselect = $5;
!                     $$ = (Node *)n;
!                 }
!         | a_expr '|' ANY '(' SubSelect ')'
!                 {
!                     SubLink *n = makeNode(SubLink);
!                     n->lefthand = lcons($1,NIL);
!                     n->oper = lcons("|",NIL);
                      n->useor = false;
                      n->subLinkType = ANY_SUBLINK;
                      n->subselect = $5;
***************
*** 4229,4234 ****
--- 4265,4280 ----
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
+         | a_expr '*' ALL '(' SubSelect ')'
+                 {
+                     SubLink *n = makeNode(SubLink);
+                     n->lefthand = lcons($1, NULL);
+                     n->oper = lcons("*",NIL);
+                     n->useor = false;
+                     n->subLinkType = ALL_SUBLINK;
+                     n->subselect = $5;
+                     $$ = (Node *)n;
+                 }
          | a_expr '%' ALL '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
***************
*** 4239,4249 ****
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
!         | a_expr '*' ALL '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("*",NIL);
                      n->useor = false;
                      n->subLinkType = ALL_SUBLINK;
                      n->subselect = $5;
--- 4285,4305 ----
                      n->subselect = $5;
                      $$ = (Node *)n;
                  }
!         | a_expr '^' ALL '(' SubSelect ')'
                  {
                      SubLink *n = makeNode(SubLink);
                      n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("^",NIL);
!                     n->useor = false;
!                     n->subLinkType = ALL_SUBLINK;
!                     n->subselect = $5;
!                     $$ = (Node *)n;
!                 }
!         | a_expr '|' ALL '(' SubSelect ')'
!                 {
!                     SubLink *n = makeNode(SubLink);
!                     n->lefthand = lcons($1, NULL);
!                     n->oper = lcons("|",NIL);
                      n->useor = false;
                      n->subLinkType = ALL_SUBLINK;
                      n->subselect = $5;
***************
*** 4325,4336 ****
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | b_expr '/' b_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
          | b_expr '%' b_expr
                  {    $$ = makeA_Expr(OP, "%", $1, $3); }
          | b_expr '^' b_expr
                  {    $$ = makeA_Expr(OP, "^", $1, $3); }
!         | b_expr '*' b_expr
!                 {    $$ = makeA_Expr(OP, "*", $1, $3); }
          | ':' b_expr
                  {    $$ = makeA_Expr(OP, ":", NULL, $2); }
          | ';' b_expr
--- 4381,4394 ----
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | b_expr '/' b_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
+         | b_expr '*' b_expr
+                 {    $$ = makeA_Expr(OP, "*", $1, $3); }
          | b_expr '%' b_expr
                  {    $$ = makeA_Expr(OP, "%", $1, $3); }
          | b_expr '^' b_expr
                  {    $$ = makeA_Expr(OP, "^", $1, $3); }
!         | b_expr '|' b_expr
!                 {    $$ = makeA_Expr(OP, "|", $1, $3); }
          | ':' b_expr
                  {    $$ = makeA_Expr(OP, ":", NULL, $2); }
          | ';' b_expr
***************
*** 4602,4611 ****
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | position_expr '/' position_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
-         | position_expr '%' position_expr
-                 {    $$ = makeA_Expr(OP, "%", $1, $3); }
          | position_expr '*' position_expr
                  {    $$ = makeA_Expr(OP, "*", $1, $3); }
          | '|' position_expr
                  {    $$ = makeA_Expr(OP, "|", NULL, $2); }
          | position_expr TYPECAST Typename
--- 4660,4673 ----
                  {    $$ = makeA_Expr(OP, "-", $1, $3); }
          | position_expr '/' position_expr
                  {    $$ = makeA_Expr(OP, "/", $1, $3); }
          | position_expr '*' position_expr
                  {    $$ = makeA_Expr(OP, "*", $1, $3); }
+         | position_expr '%' position_expr
+                 {    $$ = makeA_Expr(OP, "%", $1, $3); }
+         | position_expr '^' position_expr
+                 {    $$ = makeA_Expr(OP, "^", $1, $3); }
+         | position_expr '|' position_expr
+                 {    $$ = makeA_Expr(OP, "|", $1, $3); }
          | '|' position_expr
                  {    $$ = makeA_Expr(OP, "|", NULL, $2); }
          | position_expr TYPECAST Typename

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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] Frustration
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] Re: [GENERAL] Update of bitmask type