]> granicus.if.org Git - postgis/commitdiff
Support adding operator class members in minor upgrades
authorSandro Santilli <strk@keybit.net>
Wed, 18 Feb 2015 11:09:53 +0000 (11:09 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 18 Feb 2015 11:09:53 +0000 (11:09 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@13230 b70326c6-7e19-0410-871a-916f4a2858ee

utils/postgis_proc_upgrade.pl

index 0a2fbb558f9897483f742d0b3d8eb3de7d3a1e81..4184c74ad7e454e6f833a65cb658a78b4c762724 100755 (executable)
@@ -381,29 +381,80 @@ EOF
                my $opctype = 'unknown';
                my $opcidx = 'unknown';
                my $def = $_;
+               my $last_updated;
+               my $subcomment = '';
+               my @subobjects; # minversion, definition
                while(<INPUT>)
                {
+                       if ( /^\s*\-\-/ ) {
+                               $subcomment .= $_;
+                               next;
+                       }
+
                        $def .= $_;
                        $opctype = $1 if ( /for type (\w+) /i );
                        $opcidx = $1 if ( /using (\w+) /i );
+
+                       # Support adding members at later versions
+                       if ( /\s+(OPERATOR|FUNCTION)\s+[0-9]+\s+ / )
+                       {
+                               my $last_updated = parse_last_updated($subcomment);
+                               if ( $last_updated )
+                               {
+                                       my $subdefn = $_;
+                                       chop $subdefn;
+                                       $subdefn =~ s/[,;]$//; # strip ending comma or semicolon
+                                       # argument types must be specified in ALTER OPERATOR FAMILY
+                                       if ( $subdefn =~ m/\s+(OPERATOR.*)(FOR.*)/ )
+                                       {
+                                               $subdefn = $1.'('.$opctype.','.$opctype.') '.$2;
+                                       }
+                                       elsif ( $subdefn =~ m/\s+(FUNCTION\s+[0-9]+ )(.*)/ )
+                                       {
+                                               $subdefn = $1.'('.$opctype.','.$opctype.') '.$2;
+                                       }
+                                       push @subobjects, [$last_updated, $subdefn];
+                               }
+                               $subcomment = '';
+                       }
                        last if /\);/;
                }
                $opctype =~ tr/A-Z/a-z/;
                $opcidx =~ tr/A-Z/a-z/;
 
-    my $last_updated = parse_last_updated($comment);
+    $last_updated = parse_last_updated($comment);
     if ( ! $last_updated ) {
       print STDERR "WARNING: no last updated info for operator class '${opclassname}'\n";
       $last_updated = find_last_updated("opclasses", $opclassname);
     }
     print "-- Operator class ${opclassname} -- LastUpdated: ${last_updated}\n";
-      print <<"EOF";
+    print <<"EOF";
 DO LANGUAGE 'plpgsql'
 \$postgis_proc_upgrade\$
 BEGIN
   IF $last_updated > version_from_num FROM _postgis_upgrade_info THEN
-    EXECUTE \$postgis_proc_upgrade_parsed_def\$ $def \$postgis_proc_upgrade_parsed_def\$;
-  END IF;
+    EXECUTE \$postgis_proc_upgrade_parsed_def\$
+    $def    \$postgis_proc_upgrade_parsed_def\$;
+EOF
+    my $ELSE="ELSE -- version_from >= $last_updated";
+    for my $subobj ( @subobjects )
+    {
+      $last_updated = @{$subobj}[0];
+      $def = @{$subobj}[1];
+      print <<"EOF";
+  $ELSE
+    -- Last Updated: ${last_updated}
+    IF $last_updated > version_from_num FROM _postgis_upgrade_info THEN
+      EXECUTE \$postgis_proc_upgrade_parsed_def\$
+        ALTER OPERATOR FAMILY ${opclassname} USING ${opcidx}
+          ADD $def;
+      \$postgis_proc_upgrade_parsed_def\$;
+    END IF;
+EOF
+      $ELSE="";
+    }
+    print <<"EOF";
+  END IF; -- version_from >= $last_updated
 END
 \$postgis_proc_upgrade\$;
 EOF