public inbox for [email protected]  
help / color / mirror / Atom feed
From: ddme <[email protected]>
To: Ashutosh Bapat <[email protected]>
Cc: [email protected]
Subject: Re: Is the subtype_diff function in CREATE TYPE only can be C function?
Date: Thu, 11 Jan 2024 10:53:46 +0800
Message-ID: <[email protected]> (raw)
In-Reply-To: <CAExHW5vuJpvy7d1B_Uc8AX1r8ZsYrr-tDDjZXxwZ3HYtTRN_Kw@mail.gmail.com>
References: <[email protected]>
	<CAExHW5vuJpvy7d1B_Uc8AX1r8ZsYrr-tDDjZXxwZ3HYtTRN_Kw@mail.gmail.com>



> 2024年1月10日 18:04,Ashutosh Bapat <[email protected]> 写道:
> 
> On Wed, Jan 10, 2024 at 1:49 PM ddme <[email protected] <mailto:[email protected]>> wrote:
>> 
>> Hi all,
>> 
>> I notice that the CREATE TYPE syntax can specify subtype_diff function
>> 
>> CREATE TYPE name AS RANGE (
>>    SUBTYPE = subtype
>>    [ , SUBTYPE_OPCLASS = subtype_operator_class ]
>>    [ , COLLATION = collation ]
>>    [ , CANONICAL = canonical_function ]
>>    [ , SUBTYPE_DIFF = subtype_diff_function ] <————— here
>>    [ , MULTIRANGE_TYPE_NAME = multirange_type_name ]
>> )
>> 
>> And a example is
>> ```sql
>> 
>> CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);
>> 
>> ```
>> 
>> I notice that float8mi is a C function, and I find the call_subtype_diff() in source code that it seems only can call C function.
> 
> call_subtype_diff() invokes FunctionCall2Coll() which in turn invokes
> the function handler for non-C functions. See
> fmgr_info_cxt_security() for example. So subtype_diff can be a SQL
> callable function written in any supported language.
> 
>> 
>> I want to know
>> 
>> 1. Can the subtype_diff function in CREATE TYPE be sql or plpgsql function?
> 
> I think so.
> 
>> 2. How to call subtype_diff function? I know it related with GiST index, I need a example on how to trigger subtype_diff function.
> 
> I am not familiar with GiST code enough to answer that question. But
> looking at the places where call_subtype_diff() is called, esp. the
> comments there might give you hints.
> OR somebody more familiar with GiST code will give you a direct answer.
> 
> -- 
> Best Wishes,
> Ashutosh Bapat

Thank you!


I know that range_gist_picksplit call call_subtype_diff() but I find not call path for range_gist_picksplit.
I have try to trigger  GiST index like `CREATE INDEX … USING GIST` and using select with filter to trigger index. With the help of EXPLAIN, I get that the gist index have been triggered but subtype_diff function have not


```sql
create function float4mi(a float8, b float8) RETURNS float8 LANGUAGE SQL … …

create type float8range as range (subtype=float8, subtype_diff=float4mi);
create table float8range_test(f8r float8range);
insert into float8range_test values('[1.111,2.344]'::float8range), ('[1.111, 4.567]'::float8range);
create index my_index on float8range_test using gist(f8r);
SET enable_seqscan = off;
select * from float8range_test ORDER BY f8r;
```

Is there need more setup SQL like `CREATE OPERATOR CLASS … USING gist` to trigger?



view thread (4+ messages)

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected]
  Subject: Re: Is the subtype_diff function in CREATE TYPE only can be C function?
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox