[ https://issues.apache.org/jira/browse/HAWQ-1216?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15796695#comment-15796695 ]
ASF GitHub Bot commented on HAWQ-1216: -------------------------------------- Github user dyozie commented on a diff in the pull request: https://github.com/apache/incubator-hawq-docs/pull/77#discussion_r94512401 --- Diff: plext/using_plpython.html.md.erb --- @@ -2,374 +2,608 @@ title: Using PL/Python in HAWQ --- -This section contains an overview of the HAWQ PL/Python language extension. +This section provides an overview of the HAWQ PL/Python procedural language extension. ## <a id="abouthawqplpython"></a>About HAWQ PL/Python -PL/Python is a loadable procedural language. With the HAWQ PL/Python extension, you can write HAWQ user-defined functions in Python that take advantage of Python features and modules to quickly build robust database applications. +PL/Python is embedded in your HAWQ product distribution or within your HAWQ build if you chose to enable it as a build option. + +With the HAWQ PL/Python extension, you can write user-defined functions in Python that take advantage of Python features and modules, enabling you to quickly build robust HAWQ database applications. HAWQ uses the system Python installation. ### <a id="hawqlimitations"></a>HAWQ PL/Python Limitations -- HAWQ does not support PL/Python triggers. +- HAWQ does not support PL/Python trigger functions. - PL/Python is available only as a HAWQ untrusted language. ## <a id="enableplpython"></a>Enabling and Removing PL/Python Support -To use PL/Python in HAWQ, you must either use a pre-compiled version of HAWQ that includes PL/Python or specify PL/Python as a build option when compiling HAWQ. +To use PL/Python in HAWQ, you must either install a binary version of HAWQ that includes PL/Python or specify PL/Python as a build option when compiling HAWQ from source. + +PL/Python user-defined functions (UDFs) are registered at the database level. To create and run a PL/Python UDF on a database, you must register the PL/Python language with the database. + +On every database to which you want to install and enable PL/Python: + +1. Connect to the database using the `psql` client: + + ``` shell + $ psql -d <dbname> + ``` + + Replace \<dbname\> with the name of the target database. + +2. Run the following SQL command to register the PL/Python procedural language; you must be a database superuser to register new languages: + + ``` sql + dbname=# CREATE LANGUAGE plpythonu; + ``` -To create and run a PL/Python user-defined function (UDF) in a database, you must register the PL/Python language with the database. On every database where you want to install and enable PL/Python, connect to the database using the `psql` client. + **Note**: `plpythonu` is installed as an *untrusted* language; it offers no way of restricting what you can program in UDFs created with the language. -```shell -$ psql -d <dbname> +To remove support for `plpythonu` from a database, run the following SQL command; you must be a database superuser to remove a registered procedural language: + +``` sql +dbname=# DROP LANGUAGE plpythonu; ``` -Replace \<dbname\> with the name of the target database. +## <a id="developfunctions"></a>Developing Functions with PL/Python + +PL/Python functions are defined using the standard SQL [CREATE FUNCTION](../reference/sql/CREATE-FUNCTION.html) syntax. + +The body of a PL/Python user-defined function is a Python script. When the function is called, its arguments are passed as elements of the array `args[]`. You can also pass named arguments as ordinary variables to the Python script. -Then, run the following SQL command: +PL/Python function results are returned with a `return` statement, or a `yield` statement in the case of a result-set statement. -```shell -psql# CREATE LANGUAGE plpythonu; +The following PL/Python function computes and returns the maximum of two integers: + +``` sql +=> CREATE FUNCTION mypymax (a integer, b integer) + RETURNS integer + AS $$ + if (a is None) or (b is None): + return None + if a > b: + return a + return b + $$ LANGUAGE plpythonu; ``` -Note that `plpythonu` is installed as an “untrusted” language, meaning it does not offer any way of restricting what users can do in it. +To execute the `mypymax` function: -To remove support for `plpythonu` from a database, run the following SQL command: +``` sql +=> SELECT mypymax(5, 7); + mypymax +--------- + 7 +(1 row) +``` + +Adding the `STRICT` keyword to the `LANGUAGE` subclause instructs HAWQ to return null when any of the input arguments are null. When created as `STRICT`, the function itself need not perform null checks. -```shell -psql# DROP LANGUAGE plpythonu; +The following example uses an unnamed argument, the built-in Python `max()` function, and the `STRICT` keyword to create a UDF named `mypymax2`: + +``` sql +=> CREATE FUNCTION mypymax2 (a integer, integer) + RETURNS integer AS $$ + return max(a, args[0]) + $$ LANGUAGE plpythonu STRICT; +=> SELECT mypymax(5, 3); + mypymax2 +---------- + 5 +(1 row) +=> SELECT mypymax(5, null); + mypymax2 +---------- + +(1 row) ``` -## <a id="developfunctions"></a>Developing Functions with PL/Python +## <a id="example_createtbl"></a>Preparing For Exercises --- End diff -- Maybe change the title to "Preparing Sample Data" or "Creating the Sample Data"? > PL/Python doc page - validate and enhance info > ---------------------------------------------- > > Key: HAWQ-1216 > URL: https://issues.apache.org/jira/browse/HAWQ-1216 > Project: Apache HAWQ > Issue Type: Improvement > Components: Documentation > Reporter: Lisa Owen > Assignee: David Yozie > Priority: Minor > > PL/Python docs section: > - review and validate current content > - update module installation instructions - need to be root to install > modules to system python dirs > - make sure examples run and are relevant > - develop new examples as appropriate -- This message was sent by Atlassian JIRA (v6.3.4#6332)