diff options
author | Darik Gamble <darik.gamble@gmail.com> | 2015-02-27 10:02:44 -0500 |
---|---|---|
committer | Darik Gamble <darik.gamble@gmail.com> | 2015-02-27 10:02:44 -0500 |
commit | 5189ace117b8c3fcf6e8bb97e7507fe79cfa4806 (patch) | |
tree | daa0fb4d5ea4dbecedf686db417d2739581f9e53 | |
parent | 1fa910b7fd537a57ec551ef567e17a539ca1cff0 (diff) |
Add \df describe function special command
-rw-r--r-- | pgcli/packages/pgspecial.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/pgcli/packages/pgspecial.py b/pgcli/packages/pgspecial.py index 3fd2f98c..0d0921a3 100644 --- a/pgcli/packages/pgspecial.py +++ b/pgcli/packages/pgspecial.py @@ -123,6 +123,71 @@ def list_indexes(cur, pattern, verbose): return list_objects(cur, pattern, verbose, ['i', 's', '']) +def list_functions(cur, pattern, verbose): + + if verbose: + verbose_columns = ''' + ,CASE + WHEN p.provolatile = 'i' THEN 'immutable' + WHEN p.provolatile = 's' THEN 'stable' + WHEN p.provolatile = 'v' THEN 'volatile' + END as "Volatility", + pg_catalog.pg_get_userbyid(p.proowner) as "Owner", + l.lanname as "Language", + p.prosrc as "Source code", + pg_catalog.obj_description(p.oid, 'pg_proc') as "Description" ''' + + verbose_table = ''' LEFT JOIN pg_catalog.pg_language l + ON l.oid = p.prolang''' + else: + verbose_columns = verbose_table = '' + + sql = ''' + SELECT n.nspname as "Schema", + p.proname as "Name", + pg_catalog.pg_get_function_result(p.oid) + as "Result data type", + pg_catalog.pg_get_function_arguments(p.oid) + as "Argument data types", + CASE + WHEN p.proisagg THEN 'agg' + WHEN p.proiswindow THEN 'window' + WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype + THEN 'trigger' + ELSE 'normal' + END as "Type" ''' + verbose_columns + ''' + FROM pg_catalog.pg_proc p + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + ''' + verbose_table + ''' + WHERE ''' + + schema_pattern, func_pattern = sql_name_pattern(pattern) + params = [] + + if schema_pattern: + sql += ' n.nspname ~ %s ' + params.append(schema_pattern) + else: + sql += ' pg_catalog.pg_function_is_visible(p.oid) ' + + if func_pattern: + sql += ' AND p.proname ~ %s ' + params.append(func_pattern) + + if not (schema_pattern or func_pattern): + sql += ''' AND n.nspname <> 'pg_catalog' + AND n.nspname <> 'information_schema' ''' + + sql = cur.mogrify(sql + ' ORDER BY 1, 2, 4', params) + + log.debug(sql) + cur.execute(sql) + + if cur.description: + headers = [x[0] for x in cur.description] + return [(cur, headers, cur.statusmessage)] + + def describe_table_details(cur, pattern, verbose): """ Returns (rows, headers, status) @@ -864,6 +929,7 @@ CASE_SENSITIVE_COMMANDS = { '\\di': (list_indexes, ['\\di[+] [pattern]', 'list indexes.']), '\\dv': (list_views, ['\\dv[+] [pattern]', 'list views.']), '\\ds': (list_sequences, ['\\ds[+] [pattern]', 'list sequences.']), + '\\df': (list_functions, ['\\df[+] [pattern]', 'list functions.']) } NON_CASE_SENSITIVE_COMMANDS = { |