From 5dff93638c4443d3afba017f64c9ade69e0fbd3b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Mon, 24 Aug 2009 20:25:25 +0000
Subject: [PATCH] Make PL/Python tests more compatible with Python 3

This changes a bunch of incidentially used constructs in the PL/Python
regression tests to equivalent constructs in cases where Python 3 no longer
supports the old syntax.  Support for older Python versions is unchanged.
---
 src/pl/plpython/expected/plpython_error.out   |  8 ++++----
 src/pl/plpython/expected/plpython_error_2.out |  8 ++++----
 src/pl/plpython/expected/plpython_global.out  | 10 +++++-----
 src/pl/plpython/expected/plpython_import.out  | 20 ++++++++++++-------
 src/pl/plpython/expected/plpython_setof.out   |  2 +-
 src/pl/plpython/expected/plpython_spi.out     |  4 ++--
 src/pl/plpython/expected/plpython_test.out    |  2 +-
 src/pl/plpython/expected/plpython_trigger.out |  4 ++--
 src/pl/plpython/sql/plpython_error.sql        |  8 ++++----
 src/pl/plpython/sql/plpython_global.sql       | 10 +++++-----
 src/pl/plpython/sql/plpython_import.sql       | 20 ++++++++++++-------
 src/pl/plpython/sql/plpython_setof.sql        |  2 +-
 src/pl/plpython/sql/plpython_spi.sql          |  4 ++--
 src/pl/plpython/sql/plpython_test.sql         |  2 +-
 src/pl/plpython/sql/plpython_trigger.sql      |  4 ++--
 15 files changed, 60 insertions(+), 48 deletions(-)

diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out
index 8454b05e5ea..58f7b3a766e 100644
--- a/src/pl/plpython/expected/plpython_error.out
+++ b/src/pl/plpython/expected/plpython_error.out
@@ -45,7 +45,7 @@ CONTEXT:  PL/Python function "exception_index_invalid_nested"
  */
 CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	SD["plan"] = plpy.prepare(q, [ "test" ])
 rv = plpy.execute(SD["plan"], [ a ])
@@ -64,7 +64,7 @@ CONTEXT:  PL/Python function "invalid_type_uncaught"
  */
 CREATE FUNCTION invalid_type_caught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -87,7 +87,7 @@ CONTEXT:  PL/Python function "invalid_type_caught"
  */
 CREATE FUNCTION invalid_type_reraised(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -108,7 +108,7 @@ CONTEXT:  PL/Python function "invalid_type_reraised"
  */
 CREATE FUNCTION valid_type(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ])
 rv = plpy.execute(SD["plan"], [ a ])
 if len(rv):
diff --git a/src/pl/plpython/expected/plpython_error_2.out b/src/pl/plpython/expected/plpython_error_2.out
index 7d41c8a8695..bcbf2e655c2 100644
--- a/src/pl/plpython/expected/plpython_error_2.out
+++ b/src/pl/plpython/expected/plpython_error_2.out
@@ -45,7 +45,7 @@ CONTEXT:  PL/Python function "exception_index_invalid_nested"
  */
 CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	SD["plan"] = plpy.prepare(q, [ "test" ])
 rv = plpy.execute(SD["plan"], [ a ])
@@ -64,7 +64,7 @@ CONTEXT:  PL/Python function "invalid_type_uncaught"
  */
 CREATE FUNCTION invalid_type_caught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -87,7 +87,7 @@ CONTEXT:  PL/Python function "invalid_type_caught"
  */
 CREATE FUNCTION invalid_type_reraised(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -108,7 +108,7 @@ CONTEXT:  PL/Python function "invalid_type_reraised"
  */
 CREATE FUNCTION valid_type(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ])
 rv = plpy.execute(SD["plan"], [ a ])
 if len(rv):
diff --git a/src/pl/plpython/expected/plpython_global.out b/src/pl/plpython/expected/plpython_global.out
index f20014b926e..192e3e48a72 100644
--- a/src/pl/plpython/expected/plpython_global.out
+++ b/src/pl/plpython/expected/plpython_global.out
@@ -3,23 +3,23 @@
 --
 CREATE FUNCTION global_test_one() returns text
     AS
-'if not SD.has_key("global_test"):
+'if "global_test" not in SD:
 	SD["global_test"] = "set by global_test_one"
-if not GD.has_key("global_test"):
+if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_one"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
     LANGUAGE plpythonu;
 CREATE FUNCTION global_test_two() returns text
     AS
-'if not SD.has_key("global_test"):
+'if "global_test" not in SD:
 	SD["global_test"] = "set by global_test_two"
-if not GD.has_key("global_test"):
+if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_two"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
     LANGUAGE plpythonu;
 CREATE FUNCTION static_test() returns int4
     AS
-'if SD.has_key("call"):
+'if "call" in SD:
 	SD["call"] = SD["call"] + 1
 else:
 	SD["call"] = 1
diff --git a/src/pl/plpython/expected/plpython_import.out b/src/pl/plpython/expected/plpython_import.out
index f1f665e0523..7fcd9267371 100644
--- a/src/pl/plpython/expected/plpython_import.out
+++ b/src/pl/plpython/expected/plpython_import.out
@@ -17,11 +17,9 @@ CREATE FUNCTION import_succeed() returns text
   import cmath
   import errno
   import math
-  import md5
   import operator
   import random
   import re
-  import sha
   import string
   import time
 except Exception, ex:
@@ -31,15 +29,23 @@ return "succeeded, as expected"'
     LANGUAGE plpythonu;
 CREATE FUNCTION import_test_one(p text) RETURNS text
 	AS
-'import sha
-digest = sha.new(p)
+'try:
+    import hashlib
+    digest = hashlib.sha1(p.encode("ascii"))
+except ImportError:
+    import sha
+    digest = sha.new(p)
 return digest.hexdigest()'
 	LANGUAGE plpythonu;
 CREATE FUNCTION import_test_two(u users) RETURNS text
 	AS
-'import sha
-plain = u["fname"] + u["lname"]
-digest = sha.new(plain);
+'plain = u["fname"] + u["lname"]
+try:
+    import hashlib
+    digest = hashlib.sha1(plain.encode("ascii"))
+except ImportError:
+    import sha
+    digest = sha.new(plain);
 return "sha hash of " + plain + " is " + digest.hexdigest()'
 	LANGUAGE plpythonu;
 -- import python modules
diff --git a/src/pl/plpython/expected/plpython_setof.out b/src/pl/plpython/expected/plpython_setof.out
index 03a97194c82..ebf896df01f 100644
--- a/src/pl/plpython/expected/plpython_setof.out
+++ b/src/pl/plpython/expected/plpython_setof.out
@@ -13,7 +13,7 @@ return [ content ]*count
 $$ LANGUAGE plpythonu;
 CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$
 t = ()
-for i in xrange(count):
+for i in range(count):
 	t += ( content, )
 return t
 $$ LANGUAGE plpythonu;
diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out
index f4910d9d52b..9cef3f2bb0b 100644
--- a/src/pl/plpython/expected/plpython_spi.out
+++ b/src/pl/plpython/expected/plpython_spi.out
@@ -19,7 +19,7 @@ CREATE FUNCTION nested_call_three(a text) RETURNS text
 -- some spi stuff
 CREATE FUNCTION spi_prepared_plan_test_one(a text) RETURNS text
 	AS
-'if not SD.has_key("myplan"):
+'if "myplan" not in SD:
 	q = "SELECT count(*) FROM users WHERE lname = $1"
 	SD["myplan"] = plpy.prepare(q, [ "text" ])
 try:
@@ -32,7 +32,7 @@ return None
 	LANGUAGE plpythonu;
 CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text
 	AS
-'if not SD.has_key("myplan"):
+'if "myplan" not in SD:
 	q = "SELECT spi_prepared_plan_test_one(''%s'') as count" % a
 	SD["myplan"] = plpy.prepare(q)
 try:
diff --git a/src/pl/plpython/expected/plpython_test.out b/src/pl/plpython/expected/plpython_test.out
index 5cce4e290f0..8bef675009b 100644
--- a/src/pl/plpython/expected/plpython_test.out
+++ b/src/pl/plpython/expected/plpython_test.out
@@ -10,7 +10,7 @@ select stupid();
 -- test multiple arguments
 CREATE FUNCTION argument_test_one(u users, a1 text, a2 text) RETURNS text
 	AS
-'keys = u.keys()
+'keys = list(u.keys())
 keys.sort()
 out = []
 for key in keys:
diff --git a/src/pl/plpython/expected/plpython_trigger.out b/src/pl/plpython/expected/plpython_trigger.out
index 75914047cea..b60796dab5b 100644
--- a/src/pl/plpython/expected/plpython_trigger.out
+++ b/src/pl/plpython/expected/plpython_trigger.out
@@ -69,10 +69,10 @@ CREATE TABLE trigger_test
 	(i int, v text );
 CREATE FUNCTION trigger_data() returns trigger language plpythonu as $$
 
-if TD.has_key('relid'):
+if 'relid' in TD:
 	TD['relid'] = "bogus:12345"
 
-skeys = TD.keys()
+skeys = list(TD.keys())
 skeys.sort()
 for key in skeys:
 	val = TD[key]
diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sql
index 04161bc25ec..5ca68495be0 100644
--- a/src/pl/plpython/sql/plpython_error.sql
+++ b/src/pl/plpython/sql/plpython_error.sql
@@ -37,7 +37,7 @@ SELECT exception_index_invalid_nested();
  */
 CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	SD["plan"] = plpy.prepare(q, [ "test" ])
 rv = plpy.execute(SD["plan"], [ a ])
@@ -55,7 +55,7 @@ SELECT invalid_type_uncaught('rick');
  */
 CREATE FUNCTION invalid_type_caught(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -77,7 +77,7 @@ SELECT invalid_type_caught('rick');
  */
 CREATE FUNCTION invalid_type_reraised(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	q = "SELECT fname FROM users WHERE lname = $1"
 	try:
 		SD["plan"] = plpy.prepare(q, [ "test" ])
@@ -97,7 +97,7 @@ SELECT invalid_type_reraised('rick');
  */
 CREATE FUNCTION valid_type(a text) RETURNS text
 	AS
-'if not SD.has_key("plan"):
+'if "plan" not in SD:
 	SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ])
 rv = plpy.execute(SD["plan"], [ a ])
 if len(rv):
diff --git a/src/pl/plpython/sql/plpython_global.sql b/src/pl/plpython/sql/plpython_global.sql
index e676ad6f438..32502b41eee 100644
--- a/src/pl/plpython/sql/plpython_global.sql
+++ b/src/pl/plpython/sql/plpython_global.sql
@@ -4,18 +4,18 @@
 
 CREATE FUNCTION global_test_one() returns text
     AS
-'if not SD.has_key("global_test"):
+'if "global_test" not in SD:
 	SD["global_test"] = "set by global_test_one"
-if not GD.has_key("global_test"):
+if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_one"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
     LANGUAGE plpythonu;
 
 CREATE FUNCTION global_test_two() returns text
     AS
-'if not SD.has_key("global_test"):
+'if "global_test" not in SD:
 	SD["global_test"] = "set by global_test_two"
-if not GD.has_key("global_test"):
+if "global_test" not in GD:
 	GD["global_test"] = "set by global_test_two"
 return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
     LANGUAGE plpythonu;
@@ -23,7 +23,7 @@ return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]'
 
 CREATE FUNCTION static_test() returns int4
     AS
-'if SD.has_key("call"):
+'if "call" in SD:
 	SD["call"] = SD["call"] + 1
 else:
 	SD["call"] = 1
diff --git a/src/pl/plpython/sql/plpython_import.sql b/src/pl/plpython/sql/plpython_import.sql
index 7830dd7362d..477af328d18 100644
--- a/src/pl/plpython/sql/plpython_import.sql
+++ b/src/pl/plpython/sql/plpython_import.sql
@@ -20,11 +20,9 @@ CREATE FUNCTION import_succeed() returns text
   import cmath
   import errno
   import math
-  import md5
   import operator
   import random
   import re
-  import sha
   import string
   import time
 except Exception, ex:
@@ -35,16 +33,24 @@ return "succeeded, as expected"'
 
 CREATE FUNCTION import_test_one(p text) RETURNS text
 	AS
-'import sha
-digest = sha.new(p)
+'try:
+    import hashlib
+    digest = hashlib.sha1(p.encode("ascii"))
+except ImportError:
+    import sha
+    digest = sha.new(p)
 return digest.hexdigest()'
 	LANGUAGE plpythonu;
 
 CREATE FUNCTION import_test_two(u users) RETURNS text
 	AS
-'import sha
-plain = u["fname"] + u["lname"]
-digest = sha.new(plain);
+'plain = u["fname"] + u["lname"]
+try:
+    import hashlib
+    digest = hashlib.sha1(plain.encode("ascii"))
+except ImportError:
+    import sha
+    digest = sha.new(plain);
 return "sha hash of " + plain + " is " + digest.hexdigest()'
 	LANGUAGE plpythonu;
 
diff --git a/src/pl/plpython/sql/plpython_setof.sql b/src/pl/plpython/sql/plpython_setof.sql
index e036d569f20..53d91a9e7d7 100644
--- a/src/pl/plpython/sql/plpython_setof.sql
+++ b/src/pl/plpython/sql/plpython_setof.sql
@@ -15,7 +15,7 @@ $$ LANGUAGE plpythonu;
 
 CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$
 t = ()
-for i in xrange(count):
+for i in range(count):
 	t += ( content, )
 return t
 $$ LANGUAGE plpythonu;
diff --git a/src/pl/plpython/sql/plpython_spi.sql b/src/pl/plpython/sql/plpython_spi.sql
index c6632985257..2157569f4c7 100644
--- a/src/pl/plpython/sql/plpython_spi.sql
+++ b/src/pl/plpython/sql/plpython_spi.sql
@@ -25,7 +25,7 @@ CREATE FUNCTION nested_call_three(a text) RETURNS text
 
 CREATE FUNCTION spi_prepared_plan_test_one(a text) RETURNS text
 	AS
-'if not SD.has_key("myplan"):
+'if "myplan" not in SD:
 	q = "SELECT count(*) FROM users WHERE lname = $1"
 	SD["myplan"] = plpy.prepare(q, [ "text" ])
 try:
@@ -39,7 +39,7 @@ return None
 
 CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text
 	AS
-'if not SD.has_key("myplan"):
+'if "myplan" not in SD:
 	q = "SELECT spi_prepared_plan_test_one(''%s'') as count" % a
 	SD["myplan"] = plpy.prepare(q)
 try:
diff --git a/src/pl/plpython/sql/plpython_test.sql b/src/pl/plpython/sql/plpython_test.sql
index d45299420f7..4a7a687e666 100644
--- a/src/pl/plpython/sql/plpython_test.sql
+++ b/src/pl/plpython/sql/plpython_test.sql
@@ -9,7 +9,7 @@ select stupid();
 -- test multiple arguments
 CREATE FUNCTION argument_test_one(u users, a1 text, a2 text) RETURNS text
 	AS
-'keys = u.keys()
+'keys = list(u.keys())
 keys.sort()
 out = []
 for key in keys:
diff --git a/src/pl/plpython/sql/plpython_trigger.sql b/src/pl/plpython/sql/plpython_trigger.sql
index ce1a737a844..385fa93bda4 100644
--- a/src/pl/plpython/sql/plpython_trigger.sql
+++ b/src/pl/plpython/sql/plpython_trigger.sql
@@ -69,10 +69,10 @@ CREATE TABLE trigger_test
 
 CREATE FUNCTION trigger_data() returns trigger language plpythonu as $$
 
-if TD.has_key('relid'):
+if 'relid' in TD:
 	TD['relid'] = "bogus:12345"
 
-skeys = TD.keys()
+skeys = list(TD.keys())
 skeys.sort()
 for key in skeys:
 	val = TD[key]
-- 
GitLab