Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace source using UPDATE pg_proc #39

Open
kputnam opened this issue Oct 24, 2017 · 2 comments
Open

Replace source using UPDATE pg_proc #39

kputnam opened this issue Oct 24, 2017 · 2 comments

Comments

@kputnam
Copy link
Owner

kputnam commented Oct 24, 2017

The current method of replacing an existing function with an instrumented uses CREATE OR REPLACE FUNCTION. Since we don't save all the metadata like COST or other attributes, those can be removed on the instrumented version, and won't be restored with piggly untrace. This approach also requires recording parameter names, defaults, and other parts of the function signature so that we can properly redefine the function.

It seems like there's a simpler way to do this, which avoids those problems.

UPDATE pg_proc SET prosrc = '...' WHERE oid = 'snippets(int, int)'::regprocedure;

This preserves any parameter names, cost annotations, and other attributes and might also avoid other problems. Some work is needed to ensure this won't cause other issues. For example, if we only store the OID and the source, what do we do if the UPDATE statement doesn't update any rows (presumably the user replaced the proc since we last looked)?

@kputnam
Copy link
Owner Author

kputnam commented Oct 24, 2017

@xzilla
Copy link

xzilla commented Aug 6, 2019

In case anyone was thinking of implementing things this way, I'll +1 the idea to use pg_get_functiondef. Note it can be difficult to work with, but something like the following should work:

SELECT pg_get_functiondef(f.oid)||';'                                                               
FROM pg_catalog.pg_proc f                                                                                                   
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public' and f.proname='film_in_stock';

Note you can adjust or omit the bits of the where clause to get different results back. Hope this helps!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants