Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c11ebaa

Browse files
tglsfdcCommitfest Bot
authored and
Commitfest Bot
committed
Add cross-type comparisons for datetime types.
Discussion: https://postgr.es/m/262624.1738460652@sss.pgh.pa.us
1 parent 1e6bb5a commit c11ebaa

File tree

8 files changed

+925
-25
lines changed

8 files changed

+925
-25
lines changed

contrib/btree_gin/btree_gin--1.3--1.4.sql

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,51 @@ ADD
101101
OPERATOR 12 >= (name, text),
102102
OPERATOR 13 > (name, text)
103103
;
104+
105+
ALTER OPERATOR FAMILY date_ops USING gin
106+
ADD
107+
-- Code 1: RHS is timestamp
108+
OPERATOR 9 < (date, timestamp),
109+
OPERATOR 10 <= (date, timestamp),
110+
OPERATOR 11 = (date, timestamp),
111+
OPERATOR 12 >= (date, timestamp),
112+
OPERATOR 13 > (date, timestamp),
113+
-- Code 2: RHS is timestamptz
114+
OPERATOR 17 < (date, timestamptz),
115+
OPERATOR 18 <= (date, timestamptz),
116+
OPERATOR 19 = (date, timestamptz),
117+
OPERATOR 20 >= (date, timestamptz),
118+
OPERATOR 21 > (date, timestamptz)
119+
;
120+
121+
ALTER OPERATOR FAMILY timestamp_ops USING gin
122+
ADD
123+
-- Code 1: RHS is date
124+
OPERATOR 9 < (timestamp, date),
125+
OPERATOR 10 <= (timestamp, date),
126+
OPERATOR 11 = (timestamp, date),
127+
OPERATOR 12 >= (timestamp, date),
128+
OPERATOR 13 > (timestamp, date),
129+
-- Code 2: RHS is timestamptz
130+
OPERATOR 17 < (timestamp, timestamptz),
131+
OPERATOR 18 <= (timestamp, timestamptz),
132+
OPERATOR 19 = (timestamp, timestamptz),
133+
OPERATOR 20 >= (timestamp, timestamptz),
134+
OPERATOR 21 > (timestamp, timestamptz)
135+
;
136+
137+
ALTER OPERATOR FAMILY timestamptz_ops USING gin
138+
ADD
139+
-- Code 1: RHS is date
140+
OPERATOR 9 < (timestamptz, date),
141+
OPERATOR 10 <= (timestamptz, date),
142+
OPERATOR 11 = (timestamptz, date),
143+
OPERATOR 12 >= (timestamptz, date),
144+
OPERATOR 13 > (timestamptz, date),
145+
-- Code 2: RHS is timestamp
146+
OPERATOR 17 < (timestamptz, timestamp),
147+
OPERATOR 18 <= (timestamptz, timestamp),
148+
OPERATOR 19 = (timestamptz, timestamp),
149+
OPERATOR 20 >= (timestamptz, timestamp),
150+
OPERATOR 21 > (timestamptz, timestamp)
151+
;

contrib/btree_gin/btree_gin.c

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -483,21 +483,75 @@ leftmostvalue_timestamp(void)
483483
return TimestampGetDatum(DT_NOBEGIN);
484484
}
485485

486+
static Datum
487+
cvt_date_timestamp(Datum input)
488+
{
489+
DateADT val = DatumGetDateADT(input);
490+
Timestamp result;
491+
int overflow;
492+
493+
result = date2timestamp_opt_overflow(val, &overflow);
494+
/* We can ignore the overflow result, since result is useful as-is */
495+
return TimestampGetDatum(result);
496+
}
497+
498+
static Datum
499+
cvt_timestamptz_timestamp(Datum input)
500+
{
501+
TimestampTz val = DatumGetTimestampTz(input);
502+
Timestamp result;
503+
int overflow;
504+
505+
result = timestamptz2timestamp_opt_overflow(val, &overflow);
506+
/* We can ignore the overflow result, since result is useful as-is */
507+
return TimestampGetDatum(result);
508+
}
509+
486510
static const bool timestamp_rhs_is_varlena[] =
487-
{false};
511+
{false, false, false};
512+
513+
static const btree_gin_convert_function timestamp_cvt_fns[] =
514+
{NULL, cvt_date_timestamp, cvt_timestamptz_timestamp};
488515

489516
static const PGFunction timestamp_cmp_fns[] =
490-
{timestamp_cmp};
517+
{timestamp_cmp, date_cmp_timestamp, timestamptz_cmp_timestamp};
518+
519+
GIN_SUPPORT(timestamp, leftmostvalue_timestamp, timestamp_rhs_is_varlena, timestamp_cvt_fns, timestamp_cmp_fns)
520+
521+
static Datum
522+
cvt_date_timestamptz(Datum input)
523+
{
524+
DateADT val = DatumGetDateADT(input);
525+
TimestampTz result;
526+
int overflow;
491527

492-
GIN_SUPPORT(timestamp, leftmostvalue_timestamp, timestamp_rhs_is_varlena, NULL, timestamp_cmp_fns)
528+
result = date2timestamptz_opt_overflow(val, &overflow);
529+
/* We can ignore the overflow result, since result is useful as-is */
530+
return TimestampTzGetDatum(result);
531+
}
532+
533+
static Datum
534+
cvt_timestamp_timestamptz(Datum input)
535+
{
536+
Timestamp val = DatumGetTimestamp(input);
537+
TimestampTz result;
538+
int overflow;
539+
540+
result = timestamp2timestamptz_opt_overflow(val, &overflow);
541+
/* We can ignore the overflow result, since result is useful as-is */
542+
return TimestampTzGetDatum(result);
543+
}
493544

494545
static const bool timestamptz_rhs_is_varlena[] =
495-
{false};
546+
{false, false, false};
547+
548+
static const btree_gin_convert_function timestamptz_cvt_fns[] =
549+
{NULL, cvt_date_timestamptz, cvt_timestamp_timestamptz};
496550

497551
static const PGFunction timestamptz_cmp_fns[] =
498-
{timestamp_cmp};
552+
{timestamp_cmp, date_cmp_timestamptz, timestamp_cmp_timestamptz};
499553

500-
GIN_SUPPORT(timestamptz, leftmostvalue_timestamp, timestamptz_rhs_is_varlena, NULL, timestamptz_cmp_fns)
554+
GIN_SUPPORT(timestamptz, leftmostvalue_timestamp, timestamptz_rhs_is_varlena, timestamptz_cvt_fns, timestamptz_cmp_fns)
501555

502556
static Datum
503557
leftmostvalue_time(void)
@@ -538,13 +592,40 @@ leftmostvalue_date(void)
538592
return DateADTGetDatum(DATEVAL_NOBEGIN);
539593
}
540594

595+
static Datum
596+
cvt_timestamp_date(Datum input)
597+
{
598+
Timestamp val = DatumGetTimestamp(input);
599+
DateADT result;
600+
int overflow;
601+
602+
result = timestamp2date_opt_overflow(val, &overflow);
603+
/* We can ignore the overflow result, since result is useful as-is */
604+
return DateADTGetDatum(result);
605+
}
606+
607+
static Datum
608+
cvt_timestamptz_date(Datum input)
609+
{
610+
TimestampTz val = DatumGetTimestampTz(input);
611+
DateADT result;
612+
int overflow;
613+
614+
result = timestamptz2date_opt_overflow(val, &overflow);
615+
/* We can ignore the overflow result, since result is useful as-is */
616+
return DateADTGetDatum(result);
617+
}
618+
541619
static const bool date_rhs_is_varlena[] =
542-
{false};
620+
{false, false, false};
621+
622+
static const btree_gin_convert_function date_cvt_fns[] =
623+
{NULL, cvt_timestamp_date, cvt_timestamptz_date};
543624

544625
static const PGFunction date_cmp_fns[] =
545-
{date_cmp};
626+
{date_cmp, timestamp_cmp_date, timestamptz_cmp_date};
546627

547-
GIN_SUPPORT(date, leftmostvalue_date, date_rhs_is_varlena, NULL, date_cmp_fns)
628+
GIN_SUPPORT(date, leftmostvalue_date, date_rhs_is_varlena, date_cvt_fns, date_cmp_fns)
548629

549630
static Datum
550631
leftmostvalue_interval(void)

0 commit comments

Comments
 (0)