Skip to content

Conversation

v-maliutin
Copy link

I developed some functions to make writing tests easier. There are examples in the source code. Also, I wrote an article on habr. Here it is https://habr.com/ru/companies/gnivc/articles/877314/. I know it is in Russian, but hope modern translation will help.
Anyway such functionality is in any modern language and wide known. I just bringing it in PG world.
One more thing. I am going to introduce my work and pgTap at pgConf in Moscow on March 31 2025.

@v-maliutin
Copy link
Author

@theory Hi! Could you please let me know what you think about my PR. I'd appreciate it.

@theory
Copy link
Owner

theory commented May 22, 2025

Sorry, @v-maliutin, hyper busy rn, but will get to it.

@jnasbyupgrade
Copy link

Not a full review, but a couple comments:

AFAIK, there's no reason to modify the unpackaged script.

Instead of building a function body via ||, I think it would be a lot clearer to use format().

@v-maliutin
Copy link
Author

Not a full review, but a couple comments:

AFAIK, there's no reason to modify the unpackaged script.

Instead of building a function body via ||, I think it would be a lot clearer to use format().

@jnasbyupgrade thank you for your review. Rolled back changes in Unpackaged
Regarding format vs ||. May I stay as is? Just I always lost in '%1L, %2I, %3s'. Especially when there are a lot of %. Anyway I can fix it if you insist. This is not a big problem for me.

Copy link
Owner

@theory theory left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks super interesting, though I'm not sure they need to be procedures. I requested some change, but the big thing that's missing here is documentation. It would be super helpful for comments in the code to explain what each bit is doing and why (primary example, when it creates two mock functions without explanation). But also the new features should be documented in doc/pgtap.mmd, perhaps with a tutorial.

$$ LANGUAGE sql;

--added a column "langname" used in mock_func function
CREATE OR REPLACE VIEW tap_funky
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this file, the original tap_funky declaration should be updated, not copy-pasted at the end.

LEFT JOIN pg_language l ON l.oid = p.prolang
;

--this procedure creates a mock in place of a real function
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Procedures were added to Postgres in v11, but PGXN supports back to 9.1. You need a patch in the compat directory to remove these procedures for versions less than 11, or else convert them to functions.

where "schema" = _func_schema
and "name" = _func_name;

if _func_language = 'sql' and _returns_set then
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens when the specified function isn't found?

end;
$function$;';
execute _mock_ddl;
_mock_ddl = '
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are there two function declarations here?

$function$;';
execute _mock_ddl;
_mock_ddl = '
create or replace function ' || quote_ident(_func_schema) || '.' || quote_ident(_func_name) || _func_args || '
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
create or replace function ' || quote_ident(_func_schema) || '.' || quote_ident(_func_name) || _func_args || '
create or replace function ' || quote_ident(_func_schema) || '.' || quote_ident(_func_name) || _func_args || ' '

Be careful how you quote things. That last bit will end up with something like "foo bar"_func_args, which I don't think you want. It should be quote_ident(_func_name || _func_args). Better still use format().

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

Successfully merging this pull request may close these issues.

3 participants