]> granicus.if.org Git - postgresql/commitdiff
Improve PL/Python elog output
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 3 Nov 2009 11:05:03 +0000 (11:05 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 3 Nov 2009 11:05:03 +0000 (11:05 +0000)
When the elog functions (plpy.info etc.) get a single argument, just print
that argument instead of printing the single-member tuple like ('foo',).

src/pl/plpython/expected/plpython_import.out
src/pl/plpython/expected/plpython_spi.out
src/pl/plpython/expected/plpython_test.out
src/pl/plpython/expected/plpython_trigger.out
src/pl/plpython/plpython.c
src/pl/plpython/sql/plpython_test.sql

index 7fcd9267371b78f3353881945230cb3cc71e94ec..b91ecc6961930b4421d2f6d39bcbbcb3c1e4f193 100644 (file)
@@ -51,7 +51,7 @@ return "sha hash of " + plain + " is " + digest.hexdigest()'
 -- import python modules
 --
 SELECT import_fail();
-NOTICE:  ('import socket failed -- No module named foosocket',)
+NOTICE:  import socket failed -- No module named foosocket
 CONTEXT:  PL/Python function "import_fail"
     import_fail     
 --------------------
index 9097262a48dc9c64c8c85fe31b4f250f97f200ab..11bf00da1f53d91723f6b42545a1c42032d675a1 100644 (file)
@@ -125,7 +125,7 @@ else:
    return None
 $$ LANGUAGE plpythonu;
 SELECT result_nrows_test();
-INFO:  (True,)
+INFO:  True
 CONTEXT:  PL/Python function "result_nrows_test"
  result_nrows_test 
 -------------------
index 8bef675009b9374ceaf945e005a9000f36bcda32..c5cfe5a94f5bcdd2990d16c7e10626c725a6b5ab 100644 (file)
@@ -32,21 +32,24 @@ plpy.debug('debug')
 plpy.log('log')
 plpy.info('info')
 plpy.info(37)
+plpy.info()
 plpy.info('info', 37, [1, 2, 3])
 plpy.notice('notice')
 plpy.warning('warning')
 plpy.error('error')
 $$ LANGUAGE plpythonu;
 SELECT elog_test();
-INFO:  ('info',)
+INFO:  info
 CONTEXT:  PL/Python function "elog_test"
-INFO:  (37,)
+INFO:  37
+CONTEXT:  PL/Python function "elog_test"
+INFO:  ()
 CONTEXT:  PL/Python function "elog_test"
 INFO:  ('info', 37, [1, 2, 3])
 CONTEXT:  PL/Python function "elog_test"
-NOTICE:  ('notice',)
+NOTICE:  notice
 CONTEXT:  PL/Python function "elog_test"
-WARNING:  ('warning',)
+WARNING:  warning
 CONTEXT:  PL/Python function "elog_test"
-ERROR:  ('error',)
+ERROR:  error
 CONTEXT:  PL/Python function "elog_test"
index 06a8645a35e6ec0b7ddde25359c45dabd772b736..cf5c758fb294f13e44bcaa7aa6edc05bcf1da452 100644 (file)
@@ -91,208 +91,208 @@ CREATE TRIGGER show_trigger_data_trig_stmt
 BEFORE INSERT OR UPDATE OR DELETE OR TRUNCATE ON trigger_test
 FOR EACH STATEMENT EXECUTE PROCEDURE trigger_data(23,'skidoo');
 insert into trigger_test values(1,'insert');
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => INSERT',)
+NOTICE:  TD[event] => INSERT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => STATEMENT',)
+NOTICE:  TD[level] => STATEMENT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_stmt',)
+NOTICE:  TD[name] => show_trigger_data_trig_stmt
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => INSERT',)
+NOTICE:  TD[event] => INSERT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_before',)
+NOTICE:  TD[name] => show_trigger_data_trig_before
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[new] => {'i': 1, 'v': 'insert'}",)
+NOTICE:  TD[new] => {'i': 1, 'v': 'insert'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => INSERT',)
+NOTICE:  TD[event] => INSERT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_after',)
+NOTICE:  TD[name] => show_trigger_data_trig_after
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[new] => {'i': 1, 'v': 'insert'}",)
+NOTICE:  TD[new] => {'i': 1, 'v': 'insert'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => AFTER',)
+NOTICE:  TD[when] => AFTER
 CONTEXT:  PL/Python function "trigger_data"
 update trigger_test set v = 'update' where i = 1;
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => UPDATE',)
+NOTICE:  TD[event] => UPDATE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => STATEMENT',)
+NOTICE:  TD[level] => STATEMENT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_stmt',)
+NOTICE:  TD[name] => show_trigger_data_trig_stmt
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => UPDATE',)
+NOTICE:  TD[event] => UPDATE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_before',)
+NOTICE:  TD[name] => show_trigger_data_trig_before
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[new] => {'i': 1, 'v': 'update'}",)
+NOTICE:  TD[new] => {'i': 1, 'v': 'update'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[old] => {'i': 1, 'v': 'insert'}",)
+NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => UPDATE',)
+NOTICE:  TD[event] => UPDATE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_after',)
+NOTICE:  TD[name] => show_trigger_data_trig_after
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[new] => {'i': 1, 'v': 'update'}",)
+NOTICE:  TD[new] => {'i': 1, 'v': 'update'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[old] => {'i': 1, 'v': 'insert'}",)
+NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => AFTER',)
+NOTICE:  TD[when] => AFTER
 CONTEXT:  PL/Python function "trigger_data"
 delete from trigger_test;
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => DELETE',)
+NOTICE:  TD[event] => DELETE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => STATEMENT',)
+NOTICE:  TD[level] => STATEMENT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_stmt',)
+NOTICE:  TD[name] => show_trigger_data_trig_stmt
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => DELETE',)
+NOTICE:  TD[event] => DELETE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_before',)
+NOTICE:  TD[name] => show_trigger_data_trig_before
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[old] => {'i': 1, 'v': 'update'}",)
+NOTICE:  TD[old] => {'i': 1, 'v': 'update'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => DELETE',)
+NOTICE:  TD[event] => DELETE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => ROW',)
+NOTICE:  TD[level] => ROW
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_after',)
+NOTICE:  TD[name] => show_trigger_data_trig_after
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ("TD[old] => {'i': 1, 'v': 'update'}",)
+NOTICE:  TD[old] => {'i': 1, 'v': 'update'}
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => AFTER',)
+NOTICE:  TD[when] => AFTER
 CONTEXT:  PL/Python function "trigger_data"
 truncate table trigger_test;
-NOTICE:  ("TD[args] => ['23', 'skidoo']",)
+NOTICE:  TD[args] => ['23', 'skidoo']
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[event] => TRUNCATE',)
+NOTICE:  TD[event] => TRUNCATE
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[level] => STATEMENT',)
+NOTICE:  TD[level] => STATEMENT
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[name] => show_trigger_data_trig_stmt',)
+NOTICE:  TD[name] => show_trigger_data_trig_stmt
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[new] => None',)
+NOTICE:  TD[new] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[old] => None',)
+NOTICE:  TD[old] => None
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[relid] => bogus:12345',)
+NOTICE:  TD[relid] => bogus:12345
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_name] => trigger_test',)
+NOTICE:  TD[table_name] => trigger_test
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[table_schema] => public',)
+NOTICE:  TD[table_schema] => public
 CONTEXT:  PL/Python function "trigger_data"
-NOTICE:  ('TD[when] => BEFORE',)
+NOTICE:  TD[when] => BEFORE
 CONTEXT:  PL/Python function "trigger_data"
 DROP FUNCTION trigger_data() CASCADE;
 NOTICE:  drop cascades to 3 other objects
index 43b1db790a17ec1095f36bd028dcf22617171a55..820641708c778d42e2aca8de7f64cf33962c994b 100644 (file)
@@ -1,7 +1,7 @@
 /**********************************************************************
  * plpython.c - python as a procedural language for PostgreSQL
  *
- *     $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.131 2009/11/03 09:35:18 petere Exp $
+ *     $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.132 2009/11/03 11:05:02 petere Exp $
  *
  *********************************************************************
  */
@@ -3080,7 +3080,16 @@ PLy_output(volatile int level, PyObject *self, PyObject *args)
        char       *volatile sv;
        volatile MemoryContext oldcontext;
 
-       so = PyObject_Str(args);
+       if (PyTuple_Size(args) == 1)
+       {
+               /* Treat single argument specially to avoid undesirable
+                * ('tuple',) decoration. */
+               PyObject *o;
+               PyArg_UnpackTuple(args, "plpy.elog", 1, 1, &o);
+               so = PyObject_Str(o);
+       }
+       else
+               so = PyObject_Str(args);
        if (so == NULL || ((sv = PyString_AsString(so)) == NULL))
        {
                level = ERROR;
index 4a7a687e66681a6ce6c7b47a03d9643c89be2206..161399f2ec9f4a22244a464285177952f048f601 100644 (file)
@@ -27,6 +27,7 @@ plpy.debug('debug')
 plpy.log('log')
 plpy.info('info')
 plpy.info(37)
+plpy.info()
 plpy.info('info', 37, [1, 2, 3])
 plpy.notice('notice')
 plpy.warning('warning')