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

Call a function from another function #370

Open
dineshsivaji opened this issue Aug 6, 2023 · 6 comments
Open

Call a function from another function #370

dineshsivaji opened this issue Aug 6, 2023 · 6 comments
Labels
enhancement New feature or request

Comments

@dineshsivaji
Copy link

dineshsivaji commented Aug 6, 2023

Hi,

I am just exploring on the feasibility of using multiple functions and calling from one another.

plrust=#     CREATE OR REPLACE FUNCTION plrust.strlen(val TEXT)
plrust-#     RETURNS BIGINT
plrust-#     LANGUAGE plrust STRICT
plrust-# AS $$
plrust$#     Ok(Some(val.len() as i64))
plrust$# $$;

CREATE FUNCTION
plrust=# 
plrust=# SELECT plrust.strlen('This is a random sentence');
 strlen 
--------
     25
(1 row)

plrust=# CREATE OR REPLACE FUNCTION plrust.strlen2(val TEXT)
plrust-#     RETURNS BIGINT
plrust-#     LANGUAGE plrust STRICT
plrust-# AS $$
plrust$#     Ok(Some(plrust.strlen(val)))
plrust$# $$;
ERROR:  
   0: `cargo build` failed

Location:
   /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/mod.rs:727

`cargo build` stderr:
       Updating crates.io index
      Compiling plrust_fn_oid_16384_16428_3272765079552 v0.0.0 (/Users/dsivaji/plrust-scratch/plrust_fn_oid_16384_16428_3272765079552)
   error[E0425]: cannot find value `plrust` in this scope
     --> src/lib.rs:13:17
      |
   13 |         Ok(Some(plrust.strlen(val)))
      |                 ^^^^^^ not found in this scope

   error[E0425]: cannot find value `plrust` in this scope
     --> src/lib.rs:48:17
      |
   48 |         Ok(Some(plrust.strlen(val)))
      |                 ^^^^^^ not found in this scope

   For more information about this error, try `rustc --explain E0425`.
   error: could not compile `plrust_fn_oid_16384_16428_3272765079552` (lib) due to 2 previous errors


Source Code:
   #![deny(unsafe_op_in_unsafe_fn)]
   pub mod opened {
       #[allow(unused_imports)]
       use pgrx::prelude::*;
       #[allow(unused_lifetimes)]
       #[pg_extern]
       fn plrust_fn_oid_16384_16428<'a>(
           val: &'a str,
       ) -> ::std::result::Result<
           Option<i64>,
           Box<dyn std::error::Error + Send + Sync + 'static>,
       > {
           Ok(Some(plrust.strlen(val)))
       }
   }
   #[deny(unknown_lints)]
   mod forbidden {
       #![forbid(deprecated)]
       #![forbid(implied_bounds_entailment)]
       #![forbid(plrust_async)]
       #![forbid(plrust_autotrait_impls)]
       #![forbid(plrust_closure_trait_impl)]
       #![forbid(plrust_env_macros)]
       #![forbid(plrust_extern_blocks)]
       #![forbid(plrust_external_mod)]
       #![forbid(plrust_filesystem_macros)]
       #![forbid(plrust_fn_pointers)]
       #![forbid(plrust_leaky)]
       #![forbid(plrust_lifetime_parameterized_traits)]
       #![forbid(plrust_print_macros)]
       #![forbid(plrust_static_impls)]
       #![forbid(plrust_stdio)]
       #![forbid(plrust_suspicious_trait_object)]
       #![forbid(plrust_tuple_struct_self_pattern)]
       #![forbid(soft_unstable)]
       #![forbid(suspicious_auto_trait_impls)]
       #![forbid(unsafe_code)]
       #![forbid(where_clauses_object_safety)]
       #[allow(unused_imports)]
       use pgrx::prelude::*;
       #[allow(unused_lifetimes)]
       fn plrust_fn_oid_16384_16428<'a>(
           val: &'a str,
       ) -> ::std::result::Result<
           Option<i64>,
           Box<dyn std::error::Error + Send + Sync + 'static>,
       > {
           Ok(Some(plrust.strlen(val)))
       }
   }


Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.
plrust=# 

I read that CREATE FUNCTION is compiled to rust function internally in the documentation.
In that case, how can we call another function from inside a function ? How to expose functions to one another ?

@eeeebbbbrrrr eeeebbbbrrrr added the enhancement New feature or request label Aug 6, 2023
@eeeebbbbrrrr
Copy link
Contributor

Hi @dineshsivaji! PL/Rust doesn't support this yet. We have some loose plans around what this will look like, and intend to do it eventually. The implementation itself will largely be in pgrx. I'll leave this issue open as you're the first to publicly ask for it.

@eeeebbbbrrrr
Copy link
Contributor

I should add that you can use Spi to call another function. The major downside there is incurring the Spi overhead. Depending on what the other function does, maybe that won't be too terrible.

@dineshsivaji
Copy link
Author

Thanks, @eeeebbbbrrrr . I also thought of using SPI as an alternate. Hope this feature added in the near future.

@decarbonise
Copy link

Was just about to suggest this and saw that the issue is already open. It would be really useful for us too.

@eeeebbbbrrrr
Copy link
Contributor

It's in-progress. Most of the work has to happen in pgrx, and I've got a proof-of-concept PR up already. Probably a couple more weeks of work.

@decarbonise
Copy link

Brilliant, thanks @eeeebbbbrrrr

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

No branches or pull requests

3 participants