Skip to content

Commit 93dfbaf

Browse files
tglsfdcCommitfest Bot
authored andcommitted
Add cross-type comparisons for datetime types.
Discussion: https://postgr.es/m/[email protected]
1 parent c1047f6 commit 93dfbaf

File tree

8 files changed

+1042
-25
lines changed

8 files changed

+1042
-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 0x14 >= (name, text),
102102
OPERATOR 0x15 > (name, text)
103103
;
104+
105+
ALTER OPERATOR FAMILY date_ops USING gin
106+
ADD
107+
-- Code 1: RHS is timestamp
108+
OPERATOR 0x11 < (date, timestamp),
109+
OPERATOR 0x12 <= (date, timestamp),
110+
OPERATOR 0x13 = (date, timestamp),
111+
OPERATOR 0x14 >= (date, timestamp),
112+
OPERATOR 0x15 > (date, timestamp),
113+
-- Code 2: RHS is timestamptz
114+
OPERATOR 0x21 < (date, timestamptz),
115+
OPERATOR 0x22 <= (date, timestamptz),
116+
OPERATOR 0x23 = (date, timestamptz),
117+
OPERATOR 0x24 >= (date, timestamptz),
118+
OPERATOR 0x25 > (date, timestamptz)
119+
;
120+
121+
ALTER OPERATOR FAMILY timestamp_ops USING gin
122+
ADD
123+
-- Code 1: RHS is date
124+
OPERATOR 0x11 < (timestamp, date),
125+
OPERATOR 0x12 <= (timestamp, date),
126+
OPERATOR 0x13 = (timestamp, date),
127+
OPERATOR 0x14 >= (timestamp, date),
128+
OPERATOR 0x15 > (timestamp, date),
129+
-- Code 2: RHS is timestamptz
130+
OPERATOR 0x21 < (timestamp, timestamptz),
131+
OPERATOR 0x22 <= (timestamp, timestamptz),
132+
OPERATOR 0x23 = (timestamp, timestamptz),
133+
OPERATOR 0x24 >= (timestamp, timestamptz),
134+
OPERATOR 0x25 > (timestamp, timestamptz)
135+
;
136+
137+
ALTER OPERATOR FAMILY timestamptz_ops USING gin
138+
ADD
139+
-- Code 1: RHS is date
140+
OPERATOR 0x11 < (timestamptz, date),
141+
OPERATOR 0x12 <= (timestamptz, date),
142+
OPERATOR 0x13 = (timestamptz, date),
143+
OPERATOR 0x14 >= (timestamptz, date),
144+
OPERATOR 0x15 > (timestamptz, date),
145+
-- Code 2: RHS is timestamp
146+
OPERATOR 0x21 < (timestamptz, timestamp),
147+
OPERATOR 0x22 <= (timestamptz, timestamp),
148+
OPERATOR 0x23 = (timestamptz, timestamp),
149+
OPERATOR 0x24 >= (timestamptz, timestamp),
150+
OPERATOR 0x25 > (timestamptz, timestamp)
151+
;

contrib/btree_gin/btree_gin.c

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -491,21 +491,75 @@ leftmostvalue_timestamp(void)
491491
return TimestampGetDatum(DT_NOBEGIN);
492492
}
493493

494+
static Datum
495+
cvt_date_timestamp(Datum input)
496+
{
497+
DateADT val = DatumGetDateADT(input);
498+
Timestamp result;
499+
int overflow;
500+
501+
result = date2timestamp_opt_overflow(val, &overflow);
502+
/* We can ignore the overflow result, since result is useful as-is */
503+
return TimestampGetDatum(result);
504+
}
505+
506+
static Datum
507+
cvt_timestamptz_timestamp(Datum input)
508+
{
509+
TimestampTz val = DatumGetTimestampTz(input);
510+
Timestamp result;
511+
int overflow;
512+
513+
result = timestamptz2timestamp_opt_overflow(val, &overflow);
514+
/* We can ignore the overflow result, since result is useful as-is */
515+
return TimestampGetDatum(result);
516+
}
517+
494518
static const bool timestamp_rhs_is_varlena[] =
495-
{false};
519+
{false, false, false};
520+
521+
static const btree_gin_convert_function timestamp_cvt_fns[] =
522+
{NULL, cvt_date_timestamp, cvt_timestamptz_timestamp};
496523

497524
static const PGFunction timestamp_cmp_fns[] =
498-
{timestamp_cmp};
525+
{timestamp_cmp, date_cmp_timestamp, timestamptz_cmp_timestamp};
526+
527+
GIN_SUPPORT(timestamp, leftmostvalue_timestamp, timestamp_rhs_is_varlena, timestamp_cvt_fns, timestamp_cmp_fns)
528+
529+
static Datum
530+
cvt_date_timestamptz(Datum input)
531+
{
532+
DateADT val = DatumGetDateADT(input);
533+
TimestampTz result;
534+
int overflow;
499535

500-
GIN_SUPPORT(timestamp, leftmostvalue_timestamp, timestamp_rhs_is_varlena, NULL, timestamp_cmp_fns)
536+
result = date2timestamptz_opt_overflow(val, &overflow);
537+
/* We can ignore the overflow result, since result is useful as-is */
538+
return TimestampTzGetDatum(result);
539+
}
540+
541+
static Datum
542+
cvt_timestamp_timestamptz(Datum input)
543+
{
544+
Timestamp val = DatumGetTimestamp(input);
545+
TimestampTz result;
546+
int overflow;
547+
548+
result = timestamp2timestamptz_opt_overflow(val, &overflow);
549+
/* We can ignore the overflow result, since result is useful as-is */
550+
return TimestampTzGetDatum(result);
551+
}
501552

502553
static const bool timestamptz_rhs_is_varlena[] =
503-
{false};
554+
{false, false, false};
555+
556+
static const btree_gin_convert_function timestamptz_cvt_fns[] =
557+
{NULL, cvt_date_timestamptz, cvt_timestamp_timestamptz};
504558

505559
static const PGFunction timestamptz_cmp_fns[] =
506-
{timestamp_cmp};
560+
{timestamp_cmp, date_cmp_timestamptz, timestamp_cmp_timestamptz};
507561

508-
GIN_SUPPORT(timestamptz, leftmostvalue_timestamp, timestamptz_rhs_is_varlena, NULL, timestamptz_cmp_fns)
562+
GIN_SUPPORT(timestamptz, leftmostvalue_timestamp, timestamptz_rhs_is_varlena, timestamptz_cvt_fns, timestamptz_cmp_fns)
509563

510564
static Datum
511565
leftmostvalue_time(void)
@@ -546,13 +600,40 @@ leftmostvalue_date(void)
546600
return DateADTGetDatum(DATEVAL_NOBEGIN);
547601
}
548602

603+
static Datum
604+
cvt_timestamp_date(Datum input)
605+
{
606+
Timestamp val = DatumGetTimestamp(input);
607+
DateADT result;
608+
int overflow;
609+
610+
result = timestamp2date_opt_overflow(val, &overflow);
611+
/* We can ignore the overflow result, since result is useful as-is */
612+
return DateADTGetDatum(result);
613+
}
614+
615+
static Datum
616+
cvt_timestamptz_date(Datum input)
617+
{
618+
TimestampTz val = DatumGetTimestampTz(input);
619+
DateADT result;
620+
int overflow;
621+
622+
result = timestamptz2date_opt_overflow(val, &overflow);
623+
/* We can ignore the overflow result, since result is useful as-is */
624+
return DateADTGetDatum(result);
625+
}
626+
549627
static const bool date_rhs_is_varlena[] =
550-
{false};
628+
{false, false, false};
629+
630+
static const btree_gin_convert_function date_cvt_fns[] =
631+
{NULL, cvt_timestamp_date, cvt_timestamptz_date};
551632

552633
static const PGFunction date_cmp_fns[] =
553-
{date_cmp};
634+
{date_cmp, timestamp_cmp_date, timestamptz_cmp_date};
554635

555-
GIN_SUPPORT(date, leftmostvalue_date, date_rhs_is_varlena, NULL, date_cmp_fns)
636+
GIN_SUPPORT(date, leftmostvalue_date, date_rhs_is_varlena, date_cvt_fns, date_cmp_fns)
556637

557638
static Datum
558639
leftmostvalue_interval(void)

0 commit comments

Comments
 (0)