Here are a couple of patches, one for master and one for the back
branches from 9.5 to 10 to allow testing of plpython3 and associated
contrib modules when building with MSVC.

I've tested this out on a Windows 2016 machine with Visual Studio 2017.

I'd like to apply these - they only affect the testing script
vcregress.pl, so they should be very low risk.


cheers

andrew



-- 
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index f24f975..5dc72ff 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -246,6 +246,53 @@ sub taptest
 	exit $status if $status;
 }
 
+sub mangle_plpython3
+{
+	my $tests = shift;
+	mkdir "results" unless -d "results";
+	mkdir "sql/python3";
+	mkdir "results/python3";
+	mkdir "expected/python3";
+
+	foreach my $test (@$tests)
+	{
+		local $/ = undef;
+		foreach my $dir ('sql','expected')
+		{
+			my $extension = ($dir eq 'sql' ? 'sql' : 'out');
+
+			my @files = glob("$dir/$test.$extension $dir/${test}_[0-9].$extension");
+			foreach my $file (@files)
+			{
+				open(my $handle, "$file") || die "test file $file not found";
+				my $contents = <$handle>;
+				close($handle);
+				map
+				{
+					s/except ([[:alpha:]][[:alpha:].]*), *([[:alpha:]][[:alpha:]]*):/except $1 as $2:/g;
+					s/<type 'exceptions\.([[:alpha:]]*)'>/<class '$1'>/g;
+					s/<type 'long'>/<class 'int'>/g;
+					s/([0-9][0-9]*)L/$1/g;
+					s/([ [{])u"/$1"/g;
+					s/([ [{])u'/$1'/g;
+					s/def next/def __next__/g;
+					s/LANGUAGE plpython2?u/LANGUAGE plpython3u/g;
+					s/EXTENSION ([^ ]*_)*plpython2?u/EXTENSION $1plpython3u/g;
+					s/installing required extension "plpython2u"/installing required extension "plpython3u"/g;
+				} $contents;
+				my $base = basename $file;
+				open($handle, ">$dir/python3/$base") || die "opening python 3 file for $file";
+				print $handle $contents;
+				close($handle);
+			}
+		}
+	}
+	map { $_ =~ s!^!python3/!; } @$tests;
+	return @$tests;
+}
+
+
+
 sub plcheck
 {
 	chdir "$topdir/src/pl";
@@ -268,7 +315,8 @@ sub plcheck
 		}
 		if ($lang eq 'plpython')
 		{
-			next unless -d "$topdir/$Config/plpython2";
+			next unless -d "$topdir/$Config/plpython2" ||
+				-d "$topdir/$Config/plpython3";
 			$lang = 'plpythonu';
 		}
 		else
@@ -278,6 +326,8 @@ sub plcheck
 		my @lang_args = ("--load-extension=$lang");
 		chdir $dir;
 		my @tests = fetchTests();
+		@tests = mangle_plpython3(\@tests)
+			if $lang eq 'plpythonu' && -d "$topdir/$Config/plpython3";
 		if ($lang eq 'plperl')
 		{
 
@@ -293,6 +343,10 @@ sub plcheck
 				push(@tests, 'plperl_plperlu');
 			}
 		}
+		elsif ($lang eq 'plpythonu' && -d "$topdir/$Config/plpython3")
+		{
+			@lang_args = ();
+		}
 		print
 		  "============================================================\n";
 		print "Checking $lang\n";
@@ -335,6 +389,8 @@ sub subdircheck
 		die "Python not enabled in configuration"
 		  if !defined($config->{python});
 
+		@opts = grep { $_ !~ /plpythonu/ } @opts;
+
 		# Attempt to get python version and location.
 		# Assume python.exe in specified dir.
 		my $pythonprog = "import sys;" . "print(str(sys.version_info[0]))";
@@ -349,10 +405,7 @@ sub subdircheck
 		}
 		else
 		{
-
-			# disable tests on python3 for now.
-			chdir "..";
-			return;
+			@tests = mangle_plpython3(\@tests);
 		}
 	}
 
@@ -363,6 +416,7 @@ sub subdircheck
 		"$topdir/$Config/pg_regress/pg_regress",
 		"--bindir=${topdir}/${Config}/psql",
 		"--dbname=contrib_regression", @opts, @tests);
+	print join(' ',@args),"\n";
 	system(@args);
 	chdir "..";
 }
@@ -378,11 +432,8 @@ sub contribcheck
 		next if ($module eq "uuid-ossp"     && !defined($config->{uuid}));
 		next if ($module eq "sslinfo"       && !defined($config->{openssl}));
 		next if ($module eq "xml2"          && !defined($config->{xml}));
-		next if ($module eq "hstore_plperl" && !defined($config->{perl}));
-		next if ($module eq "jsonb_plperl"  && !defined($config->{perl}));
-		next if ($module eq "hstore_plpython" && !defined($config->{python}));
-		next if ($module eq "jsonb_plpython"  && !defined($config->{python}));
-		next if ($module eq "ltree_plpython"  && !defined($config->{python}));
+		next if ($module =~ /_plperl$/      && !defined($config->{perl}));
+		next if ($module =~ /_plpython$/    && !defined($config->{python}));
 		next if ($module eq "sepgsql");
 
 		subdircheck("$topdir/contrib", $module);
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index 2904679..43d5d76 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -244,6 +244,53 @@ sub taptest
 	exit $status if $status;
 }
 
+sub mangle_plpython3
+{
+	my $tests = shift;
+	mkdir "results" unless -d "results";
+	mkdir "sql/python3";
+	mkdir "results/python3";
+	mkdir "expected/python3";
+
+	foreach my $test (@$tests)
+	{
+		local $/ = undef;
+		foreach my $dir ('sql','expected')
+		{
+			my $extension = ($dir eq 'sql' ? 'sql' : 'out');
+
+			my @files = glob("$dir/$test.$extension $dir/${test}_[0-9].$extension");
+			foreach my $file (@files)
+			{
+				open(my $handle, "$file") || die "test file $file not found";
+				my $contents = <$handle>;
+				close($handle);
+				map
+				{
+					s/except ([[:alpha:]][[:alpha:].]*), *([[:alpha:]][[:alpha:]]*):/except $1 as $2:/g;
+					s/<type 'exceptions\.([[:alpha:]]*)'>/<class '$1'>/g;
+					s/<type 'long'>/<class 'int'>/g;
+					s/([0-9][0-9]*)L/$1/g;
+					s/([ [{])u"/$1"/g;
+					s/([ [{])u'/$1'/g;
+					s/def next/def __next__/g;
+					s/LANGUAGE plpython2?u/LANGUAGE plpython3u/g;
+					s/EXTENSION ([^ ]*_)*plpython2?u/EXTENSION $1plpython3u/g;
+					s/installing required extension "plpython2u"/installing required extension "plpython3u"/g;
+				} $contents;
+				my $base = basename $file;
+				open($handle, ">$dir/python3/$base") || die "opening python 3 file for $file";
+				print $handle $contents;
+				close($handle);
+			}
+		}
+	}
+	map { $_ =~ s!^!python3/!; } @$tests;
+	return @$tests;
+}
+
+
+
 sub plcheck
 {
 	chdir "../../pl";
@@ -254,7 +301,8 @@ sub plcheck
 		my $lang = $pl eq 'tcl' ? 'pltcl' : $pl;
 		if ($lang eq 'plpython')
 		{
-			next unless -d "../../$Config/plpython2";
+			next unless -d "$topdir/$Config/plpython2" ||
+				-d "$topdir/$Config/plpython3";
 			$lang = 'plpythonu';
 		}
 		else
@@ -264,6 +312,8 @@ sub plcheck
 		my @lang_args = ("--load-extension=$lang");
 		chdir $pl;
 		my @tests = fetchTests();
+		@tests = mangle_plpython3(\@tests)
+			if $lang eq 'plpythonu' && -d "$topdir/$Config/plpython3";
 		if ($lang eq 'plperl')
 		{
 
@@ -279,6 +329,10 @@ sub plcheck
 				push(@tests, 'plperl_plperlu');
 			}
 		}
+		elsif ($lang eq 'plpythonu' && -d "$topdir/$Config/plpython3")
+		{
+			@lang_args = ();
+		}
 		print
 		  "============================================================\n";
 		print "Checking $lang\n";
@@ -320,6 +374,8 @@ sub subdircheck
 		die "Python not enabled in configuration"
 		  if !defined($config->{python});
 
+		@opts = grep { $_ !~ /plpythonu/ } @opts;
+
 		# Attempt to get python version and location.
 		# Assume python.exe in specified dir.
 		my $pythonprog = "import sys;" . "print(str(sys.version_info[0]))";
@@ -334,10 +390,7 @@ sub subdircheck
 		}
 		else
 		{
-
-			# disable tests on python3 for now.
-			chdir "..";
-			return;
+			@tests = mangle_plpython3(\@tests);
 		}
 	}
 
@@ -348,6 +401,7 @@ sub subdircheck
 		"$topdir/$Config/pg_regress/pg_regress",
 		"--bindir=${topdir}/${Config}/psql",
 		"--dbname=contrib_regression", @opts, @tests);
+	print join(' ',@args),"\n";
 	system(@args);
 	chdir "..";
 }
@@ -363,9 +417,8 @@ sub contribcheck
 		next if ($module eq "uuid-ossp"     && !defined($config->{uuid}));
 		next if ($module eq "sslinfo"       && !defined($config->{openssl}));
 		next if ($module eq "xml2"          && !defined($config->{xml}));
-		next if ($module eq "hstore_plperl" && !defined($config->{perl}));
-		next if ($module eq "hstore_plpython" && !defined($config->{python}));
-		next if ($module eq "ltree_plpython"  && !defined($config->{python}));
+		next if ($module =~ /_plperl$/      && !defined($config->{perl}));
+		next if ($module =~ /_plpython$/    && !defined($config->{python}));
 		next if ($module eq "sepgsql");
 
 		subdircheck("$topdir/contrib", $module);

Reply via email to