-- Miscellaneous extra tests added in GPDB.
-- test of exception handling
CREATE OR REPLACE FUNCTION queryexec( query text ) returns boolean
AS $$
try:
  plan = plpy.prepare( query )
  rv = plpy.execute( plan )
except:
  plpy.notice( 'Error Trapped' )
  return False

for r in rv:
  plpy.notice( str( r ) )

return True
$$ LANGUAGE plpythonu;
SELECT queryexec('SELECT 2'); 
NOTICE:  {'?column?': 2}
CONTEXT:  PL/Python function "queryexec"
 queryexec 
-----------
 t
(1 row)

SELECT queryexec('SELECT X'); 
NOTICE:  Error Trapped
CONTEXT:  PL/Python function "queryexec"
 queryexec 
-----------
 f
(1 row)

--
create or replace function split(input int) returns setof ab_tuple as
$$
       plpy.log("Returning the FIRST tuple")
       yield [input, input + 1]
       plpy.log("Returning the SECOND tuple"); 
       yield [input+2, input + 3]
$$
LANGUAGE plpythonu; 
SELECT (split(10)).*; 
 a  | b  
----+----
 10 | 11
 12 | 13
(2 rows)

SELECT * FROM split(100); 
  a  |  b  
-----+-----
 100 | 101
 102 | 103
(2 rows)

-- Test named and unnamed tuples.
CREATE OR REPLACE FUNCTION unnamed_tuple_test() RETURNS VOID LANGUAGE plpythonu AS $$
plpy.execute("SHOW client_min_messages")
$$;
CREATE FUNCTION named_tuple_test() RETURNS VARCHAR LANGUAGE plpythonu AS $$
return plpy.execute("SELECT setting FROM pg_settings WHERE name='client_min_messages'")[0]['setting']
$$;
select unnamed_tuple_test(); 
 unnamed_tuple_test 
--------------------
 
(1 row)

select named_tuple_test(); 
 named_tuple_test 
------------------
 notice
(1 row)

--
-- These test results will follow the upsteam results
CREATE OR REPLACE FUNCTION oneline() returns text as $$ 
return 'No spaces' 
$$ LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION oneline2() returns text as $$  
x = "\""
y = ''
z = ""
w = '\'' + 'a string with # and "" inside ' + "another string with #  and '' inside "
return x + y + z + w
$$ LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION multiline() returns text as $$ 
return """ One space
  Two spaces
   Three spaces
No spaces""" 
$$ LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION multiline2() returns text as $$
# If there's something in my comment it can mess things up
return '''
The ' in the comment should not cause this line to begin with a tab
''' + 'This is a rather long string containing\n\
    several lines of text just as you would do in C.\n\
     Note that whitespace at the beginning of the line is\
significant. The string can contain both \' and ".\n' + r"This is an another long string containing\n\
two lines of text and defined with the r\"...\" syntax."
$$ LANGUAGE plpythonu; 
CREATE OR REPLACE FUNCTION multiline3() returns text as $$  
# This is a comment
x = """ 
  # This is not a comment so the quotes at the end of the line do end the string """ 
return x
$$ LANGUAGE plpythonu;
select oneline() 
union all 
select oneline2()
union all 
select multiline() 
union all 
select multiline2() 
union all 
select multiline3();
                                                          oneline                                                          
---------------------------------------------------------------------------------------------------------------------------
 No spaces
 "'a string with # and "" inside another string with #  and '' inside 
  One space                                                                                                               +
           Two spaces                                                                                                     +
            Three spaces                                                                                                  +
         No spaces
                                                                                                                          +
         The ' in the comment should not cause this line to begin with a tab                                              +
         This is a rather long string containing                                                                          +
             several lines of text just as you would do in C.                                                             +
              Note that whitespace at the beginning of the line is       significant. The string can contain both ' and ".+
 This is an another long string containing\n\                                                                             +
         two lines of text and defined with the r\"...\" syntax.
                                                                                                                          +
           # This is not a comment so the quotes at the end of the line do end the string 
(5 rows)

