Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdfe0475

Browse files
committed
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More patches for date/timeI have accumulated several patches to add functionality to the datetimeand timespan data types as well as to fix reported porting bugs on non-BSDmachines. These patches are:dt.c.patch - add datetime_part(), fix bugsdt.h.patch - add quarter and timezone support, add prototypesglobals.c.patch - add time and timezone variablesmiscadmin.h.patch - add time and timezone variablesnabstime.c.patch - add datetime conversion routinenabstime.h.patch - add prototypespg_operator.h.patch - add datetime operators, clean up formattingpg_proc.h.patch - add datetime functions, reassign conflicting date OIDspg_type.h.patch - add datetime and timespan data typesThe dt.c and pg_proc.h patches are fairly large; the latter mostly because I triedto get some columns for existing entries to line up.
1 parentd2a386d commitdfe0475

File tree

9 files changed

+1457
-706
lines changed

9 files changed

+1457
-706
lines changed

‎src/backend/utils/adt/dt.c

Lines changed: 939 additions & 421 deletions
Large diffs are not rendered by default.

‎src/backend/utils/adt/nabstime.c

Lines changed: 105 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.16 1997/03/21 18:53:28 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.17 1997/03/25 08:09:35 scrappy Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -62,13 +62,13 @@ GetCurrentAbsoluteTime(void)
6262
CTimeZone=-tmnow->tm_gmtoff;/* tm_gmtoff is Sun/DEC-ism */
6363
CDayLight= (tmnow->tm_isdst>0);
6464
/* XXX is there a better way to get local timezone string in V7? - tgl 97/03/18 */
65-
strftime(CTZName,8,"%Z",localtime(&now));
65+
strftime(CTZName,MAXTZLEN,"%Z",localtime(&now));
6666
#endif
6767
#else/* ! USE_POSIX_TIME */
6868
CTimeZone=tbnow.timezone*60;
6969
CDayLight= (tbnow.dstflag!=0);
7070
/* XXX does this work to get the local timezone string in V7? - tgl 97/03/18 */
71-
strftime(CTZName,8,"%Z",localtime(&now));
71+
strftime(CTZName,MAXTZLEN,"%Z",localtime(&now));
7272
#endif
7373
};
7474

@@ -102,15 +102,61 @@ GetCurrentTime(struct tm *tm)
102102
}/* GetCurrentTime() */
103103

104104

105+
AbsoluteTimetm2abstime(structtm*tm,inttz);
106+
107+
AbsoluteTime
108+
tm2abstime(structtm*tm,inttz)
109+
{
110+
intday,sec;
111+
112+
/* validate, before going out of range on some members */
113+
if (tm->tm_year<1901||tm->tm_year>2038
114+
||tm->tm_mon<1||tm->tm_mon>12
115+
||tm->tm_mday<1||tm->tm_mday>31
116+
||tm->tm_hour<0||tm->tm_hour >=24
117+
||tm->tm_min<0||tm->tm_min>59
118+
||tm->tm_sec<0||tm->tm_sec>59)
119+
returnINVALID_ABSTIME;
120+
121+
day= (date2j(tm->tm_year,tm->tm_mon,tm->tm_mday)-date2j(1970,1,1));
122+
123+
/* check for time out of range */
124+
if ((day<MIN_DAYNUM)|| (day>MAX_DAYNUM))
125+
returnINVALID_ABSTIME;
126+
127+
/* convert to seconds */
128+
sec=tm->tm_sec+tz+ (tm->tm_min+(day*24+tm->tm_hour)*60)*60;
129+
130+
/* check for overflow */
131+
if ((day==MAX_DAYNUM&&sec<0)||
132+
(day==MIN_DAYNUM&&sec>0))
133+
returnINVALID_ABSTIME;
134+
135+
/* daylight correction */
136+
if (tm->tm_isdst<0) {/* unknown; find out */
137+
tm->tm_isdst= (CDayLight>0);
138+
};
139+
if (tm->tm_isdst>0)
140+
sec-=60*60;
141+
142+
/* check for reserved values (e.g. "current" on edge of usual range */
143+
if (!AbsoluteTimeIsReal(sec))
144+
returnINVALID_ABSTIME;
145+
146+
returnsec;
147+
}/* tm2abstime() */
148+
149+
105150
/* nabstimein()
106151
* Decode date/time string and return abstime.
107152
*/
108153
AbsoluteTime
109154
nabstimein(char*str)
110155
{
111-
intsec;
156+
AbsoluteTimeresult;
157+
112158
doublefsec;
113-
intday,tz=0;
159+
inttz=0;
114160
structtmdate,*tm=&date;
115161

116162
char*field[MAXDATEFIELDS];
@@ -134,65 +180,35 @@ printf( "nabstimein- %d fields are type %d (DTK_DATE=%d)\n", nf, dtype, DTK_DATE
134180

135181
switch (dtype) {
136182
caseDTK_DATE:
137-
#ifFALSE
138-
return(dateconv(&date,tz));
139-
#endif
140-
/* validate, before going out of range on some members */
141-
if (tm->tm_year<1901||tm->tm_year>2038
142-
||tm->tm_mon<1||tm->tm_mon>12
143-
||tm->tm_mday<1||tm->tm_mday>31
144-
||tm->tm_hour<0||tm->tm_hour >=24
145-
||tm->tm_min<0||tm->tm_min>59
146-
||tm->tm_sec<0||tm->tm_sec>59)
147-
returnINVALID_ABSTIME;
148-
149-
day= (date2j(tm->tm_year,tm->tm_mon,tm->tm_mday)-date2j(1970,1,1));
150-
151-
/* check for time out of range */
152-
if ((day<MIN_DAYNUM)|| (day>MAX_DAYNUM))
153-
returnINVALID_ABSTIME;
154-
155-
/* convert to seconds */
156-
sec=tm->tm_sec+tz+ (tm->tm_min+(day*24+tm->tm_hour)*60)*60;
157-
158-
/* check for overflow */
159-
if ((day==MAX_DAYNUM&&sec<0)||
160-
(day==MIN_DAYNUM&&sec>0))
161-
returnINVALID_ABSTIME;
162-
163-
/* daylight correction */
164-
if (tm->tm_isdst<0) {/* unknown; find out */
165-
tm->tm_isdst= (CDayLight>0);
166-
};
167-
if (tm->tm_isdst>0)
168-
sec-=60*60;
169-
170-
/* check for reserved values (e.g. "current" on edge of usual range */
171-
if (!AbsoluteTimeIsReal(sec))
172-
returnINVALID_ABSTIME;
173-
174-
returnsec;
183+
result=tm2abstime(tm,tz);
184+
break;
175185

176186
caseDTK_EPOCH:
177-
returnEPOCH_ABSTIME;
187+
result=EPOCH_ABSTIME;
188+
break;
178189

179190
caseDTK_CURRENT:
180-
returnCURRENT_ABSTIME;
191+
result=CURRENT_ABSTIME;
192+
break;
181193

182194
caseDTK_LATE:
183-
returnNOEND_ABSTIME;
195+
result=NOEND_ABSTIME;
196+
break;
184197

185198
caseDTK_EARLY:
186-
returnNOSTART_ABSTIME;
199+
result=NOSTART_ABSTIME;
200+
break;
187201

188202
caseDTK_INVALID:
189-
returnINVALID_ABSTIME;
203+
result=INVALID_ABSTIME;
204+
break;
190205

191206
default:
207+
elog(WARN,"Bad abstime (internal coding error) '%s'",str);
208+
result=INVALID_ABSTIME;
192209
};
193210

194-
elog(WARN,"Bad abstime (internal coding error) '%s'",str);
195-
returnINVALID_ABSTIME;
211+
returnresult;
196212
}/* nabstimein() */
197213

198214

@@ -432,3 +448,42 @@ abstimege(AbsoluteTime t1, AbsoluteTime t2)
432448

433449
return(t1 >=t2);
434450
}
451+
452+
/* datetime_abstime()
453+
* Convert datetime to abstime.
454+
*/
455+
AbsoluteTime
456+
datetime_abstime(DateTime*datetime)
457+
{
458+
AbsoluteTimeresult;
459+
460+
doublefsec;
461+
structtmtt,*tm=&tt;
462+
463+
if (!PointerIsValid(datetime)) {
464+
result=INVALID_ABSTIME;
465+
466+
}elseif (DATETIME_IS_INVALID(*datetime)) {
467+
result=INVALID_ABSTIME;
468+
469+
}elseif (DATETIME_IS_NOBEGIN(*datetime)) {
470+
result=NOSTART_ABSTIME;
471+
472+
}elseif (DATETIME_IS_NOEND(*datetime)) {
473+
result=NOEND_ABSTIME;
474+
475+
}else {
476+
if (DATETIME_IS_RELATIVE(*datetime)) {
477+
datetime2tm(SetDateTime(*datetime),tm,&fsec);
478+
result=tm2abstime(tm,0);
479+
480+
}elseif (datetime2tm(*datetime,tm,&fsec)==0) {
481+
result=tm2abstime(tm,0);
482+
483+
}else {
484+
result=INVALID_ABSTIME;
485+
};
486+
};
487+
488+
return(result);
489+
}/* datetime_abstime() */

‎src/backend/utils/init/globals.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/init/globals.c,v 1.7 1997/03/18 20:14:46 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/init/globals.c,v 1.8 1997/03/25 08:09:43 scrappy Exp $
1111
*
1212
* NOTES
1313
* Globals used all over the place should be declared here and not
@@ -65,11 +65,12 @@ boolIsPostmaster = false;
6565

6666
shortDebugLvl=0;
6767

68+
intDateStyle=USE_ISO_DATES;
6869
boolEuroDates= false;
6970
boolHasCTZSet= false;
7071
boolCDayLight= false;
7172
intCTimeZone=0;
72-
charCTZName[8]="";
73+
charCTZName[MAXTZLEN+1]="";
7374

7475
charDateFormat[20]="%d-%m-%Y";/* mjl: sizes! or better malloc? XXX */
7576
charFloatFormat[20]="%f";

‎src/include/catalog/pg_operator.h

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: pg_operator.h,v 1.5 1997/03/12 21:27:18 scrappy Exp $
10+
* $Id: pg_operator.h,v 1.6 1997/03/25 08:10:37 scrappy Exp $
1111
*
1212
* NOTES
1313
* the genbki.sh script reads this file and generates .bki
@@ -185,7 +185,7 @@ DATA(insert OID = 513 ( "@@" PGUID 0 l t f 0 603 600 0 0 0 0 box
185185
DATA(insertOID=514 ("*"PGUID0btf232323514000int4mulintltselintltjoinsel ));
186186
DATA(insertOID=515 ("!"PGUID0rtf230230000int4facintltselintltjoinsel ));
187187
DATA(insertOID=516 ("!!"PGUID0ltf023230000int4facintltselintltjoinsel ));
188-
DATA(insertOID=517 ("<===>"PGUID0btf600600230000pointdistintltselintltjoinsel ));
188+
DATA(insertOID=517 ("<===>"PGUID0btf6006007010000point_distanceintltselintltjoinsel ));
189189
DATA(insertOID=518 ("<>"PGUID0btf2323165189600int4neneqselneqjoinsel ));
190190
DATA(insertOID=519 ("<>"PGUID0btf2121165199400int2neneqselneqjoinsel ));
191191
DATA(insertOID=520 (">"PGUID0btf21211695000int2gtintgtselintgtjoinsel ));
@@ -226,8 +226,8 @@ DATA(insert OID = 554 ( "-" PGUID 0 b t f 21 21 21 0 0 0 0 int
226226
DATA(insertOID=555 ("-"PGUID0btf2323230000int4miintltselintltjoinsel ));
227227
DATA(insertOID=556 ("-"PGUID0btf2123230000int24miintltselintltjoinsel ));
228228
DATA(insertOID=557 ("-"PGUID0btf2321230000int42miintltselintltjoinsel ));
229-
DATA(insertOID=558("-"PGUID0ltf023230000int4umintltselintltjoinsel ));
230-
DATA(insertOID=559("-"PGUID0ltf021210000int2umintltselintltjoinsel ));
229+
DATA(insertOID=558 ("-"PGUID0ltf023230000int4umintltselintltjoinsel ));
230+
DATA(insertOID=559 ("-"PGUID0ltf021210000int2umintltselintltjoinsel ));
231231
DATA(insertOID=560 ("="PGUID0btt70270216560561562562abstimeeqeqseleqjoinsel ));
232232
DATA(insertOID=561 ("<>"PGUID0btf7027021656156000abstimeneneqselneqjoinsel ));
233233
DATA(insertOID=562 ("<"PGUID0btf7027021656356500abstimeltintltselintltjoinsel ));
@@ -362,8 +362,8 @@ DATA(insert OID = 935 ( "<>" PGUID 0 b t f 910 910 16 935 932 0 0 oidi
362362

363363
DATA(insertOID=965 ("^"PGUID0btf7017017010000dpow-- ));
364364
DATA(insertOID=966 ("+"PGUID0btf1034103310340000aclinsertintltselintltjoinsel ));
365-
DATA(insertOID=967 ("-"PGUID0btf1034103310340000aclremoveintltselintltjoinsel ));
366-
DATA(insertOID=968 ("~"PGUID0btf10341033160000aclcontainsintltselintltjoinsel ));
365+
DATA(insertOID=967 ("-"PGUID0btf1034103310340000aclremoveintltselintltjoinsel ));
366+
DATA(insertOID=968 ("~"PGUID0btf10341033160000aclcontainsintltselintltjoinsel ));
367367

368368
DATA(insertOID=1054 ("="PGUID0btt10421042161054105710581058bpchareqeqseleqjoinsel ));
369369
DATA(insertOID=1055 ("~"PGUID0btf104225160105600textregexeqeqseleqjoinsel ));
@@ -383,27 +383,53 @@ DATA(insert OID = 1067 ( "<=" PGUID 0 b t f 1043 1043 16 1069 1068 0 0
383383
DATA(insertOID=1068 (">"PGUID0btf10431043161066106700varchargtintltselintltjoinsel ));
384384
DATA(insertOID=1069 (">="PGUID0btf10431043161067106600varchargeintltselintltjoinsel ));
385385

386-
DATA(insertOID=1093 ("="PGUID0btt10821082161093109410951095date_eqeqseleqjoinsel ));
387-
DATA(insertOID=1094 ("<>"PGUID0btf10821082161094109300date_neneqselneqjoinsel ));
388-
DATA(insertOID=1095 ("<"PGUID0btf10821082161097109800date_ltintltselintltjoinsel ));
389-
DATA(insertOID=1096 ("<="PGUID0btf10821082161098109700date_leintltselintltjoinsel ));
390-
DATA(insertOID=1097 (">"PGUID0btf10821082161095109600date_gtintltselintltjoinsel ));
391-
DATA(insertOID=1098 (">="PGUID0btf10821082161096106500date_geintltselintltjoinsel ));
392-
DATA(insertOID=1099 ("-"PGUID0btf10821082230000date_mi-- ));
393-
DATA(insertOID=1100 ("+"PGUID0btf10822310820000date_pli-- ));
394-
DATA(insertOID=1101 ("-"PGUID0btf10822310820000date_mii-- ));
395-
386+
/* date operators */
387+
DATA(insertOID=1093 ("="PGUID0btt10821082161093109410951095date_eqeqseleqjoinsel ));
388+
DATA(insertOID=1094 ("<>"PGUID0btf10821082161094109300date_neneqselneqjoinsel ));
389+
DATA(insertOID=1095 ("<"PGUID0btf10821082161097109800date_ltintltselintltjoinsel ));
390+
DATA(insertOID=1096 ("<="PGUID0btf10821082161098109700date_leintltselintltjoinsel ));
391+
DATA(insertOID=1097 (">"PGUID0btf10821082161095109600date_gtintltselintltjoinsel ));
392+
DATA(insertOID=1098 (">="PGUID0btf10821082161096106500date_geintltselintltjoinsel ));
393+
DATA(insertOID=1099 ("-"PGUID0btf10821082230000date_mi-- ));
394+
DATA(insertOID=1100 ("+"PGUID0btf10822310820000date_pli-- ));
395+
DATA(insertOID=1101 ("-"PGUID0btf10822310820000date_mii-- ));
396+
397+
/* time operators */
396398
DATA(insertOID=1108 ("="PGUID0btt10831083161108110911101110time_eqeqseleqjoinsel ));
397399
DATA(insertOID=1109 ("<>"PGUID0btf10831083161109110800time_neneqselneqjoinsel ));
398400
DATA(insertOID=1110 ("<"PGUID0btf10831083161112111300time_ltintltselintltjoinsel ));
399401
DATA(insertOID=1111 ("<="PGUID0btf10831083161113111200time_leintltselintltjoinsel ));
400402
DATA(insertOID=1112 (">"PGUID0btf10831083161110111100time_gtintltselintltjoinsel ));
401403
DATA(insertOID=1113 (">="PGUID0btf10831083161111106500time_geintltselintltjoinsel ));
402404

405+
/* datetime operators */
406+
/* name, owner, prec, kind, isleft, canhash, left, right, result, com, negate, lsortop, rsortop, oprcode, operrest, oprjoin */
407+
DATA(insertOID=1320 ("="PGUID0btf11841184161320132113221322datetime_eqeqseleqjoinsel ));
408+
DATA(insertOID=1321 ("<>"PGUID0btf11841184161321132000datetime_neneqselneqjoinsel ));
409+
DATA(insertOID=1322 ("<"PGUID0btf11841184161325132500datetime_ltintltselintltjoinsel ));
410+
DATA(insertOID=1323 ("<="PGUID0btf11841184161324132400datetime_leintltselintltjoinsel ));
411+
DATA(insertOID=1324 (">"PGUID0btf11841184161323132300datetime_gtintltselintltjoinsel ));
412+
DATA(insertOID=1325 (">="PGUID0btf11841184161322132200datetime_geintltselintltjoinsel ));
413+
414+
DATA(insertOID=1327 ("+"PGUID0btf1184118611841327000datetime_add_span-- ));
415+
DATA(insertOID=1328 ("-"PGUID0btf1184118411860000datetime_sub-- ));
416+
417+
/* timespan operators */
418+
DATA(insertOID=1330 ("="PGUID0btf11861186161330133113321332timespan_eqeqseleqjoinsel ));
419+
DATA(insertOID=1331 ("<>"PGUID0btf11861186161331133000timespan_neneqselneqjoinsel ));
420+
DATA(insertOID=1332 ("<"PGUID0btf11861186161335133500timespan_ltintltselintltjoinsel ));
421+
DATA(insertOID=1333 ("<="PGUID0btf11861186161334133400timespan_leintltselintltjoinsel ));
422+
DATA(insertOID=1334 (">"PGUID0btf11861186161333133300timespan_gtintltselintltjoinsel ));
423+
DATA(insertOID=1335 (">="PGUID0btf11861186161332133200timespan_geintltselintltjoinsel ));
424+
425+
DATA(insertOID=1336 ("-"PGUID0btf0118611860000timespan_um00 ));
426+
DATA(insertOID=1337 ("+"PGUID0btf1186118611861337000timespan_add-- ));
427+
DATA(insertOID=1338 ("-"PGUID0btf1186118611860000timespan_sub-- ));
428+
403429
/* float48 operators */
404430
DATA(insertOID=1116 ("+"PGUID0btf7007017011116000float48pl-- ));
405-
DATA(insertOID=1117 ("-"PGUID0btf7007017010000float48mi-- ));
406-
DATA(insertOID=1118 ("/"PGUID0btf7007017010000float48div-- ));
431+
DATA(insertOID=1117 ("-"PGUID0btf7007017010000float48mi-- ));
432+
DATA(insertOID=1118 ("/"PGUID0btf7007017010000float48div-- ));
407433
DATA(insertOID=1119 ("*"PGUID0btf7007017011119000float48mul-- ));
408434
DATA(insertOID=1120 ("="PGUID0btt700701161120112111221122float48eqeqseleqjoinsel ));
409435
DATA(insertOID=1121 ("<>"PGUID0btf700701161121112000float48neneqselneqjoinsel ));
@@ -414,8 +440,8 @@ DATA(insert OID = 1125 ( ">=" PGUID 0 b t f 700 701 16 1124 1122 0 0 f
414440

415441
/* float84 operators */
416442
DATA(insertOID=1126 ("+"PGUID0btf7017007011126000float84pl-- ));
417-
DATA(insertOID=1127 ("-"PGUID0btf7017007010000float84mi-- ));
418-
DATA(insertOID=1128 ("/"PGUID0btf7017007010000float84div-- ));
443+
DATA(insertOID=1127 ("-"PGUID0btf7017007010000float84mi-- ));
444+
DATA(insertOID=1128 ("/"PGUID0btf7017007010000float84div-- ));
419445
DATA(insertOID=1129 ("*"PGUID0btf7017007011129000float84mul-- ));
420446
DATA(insertOID=1130 ("="PGUID0btt701700161130113111321132float84eqeqseleqjoinsel ));
421447
DATA(insertOID=1131 ("<>"PGUID0btf701700161131113000float84neneqselneqjoinsel ));
@@ -463,6 +489,7 @@ DATA(insert OID = 1232 ( "~*" PGUID 0 b t f 1043 25 16 0 1233 0 0 text
463489
DATA(insertOID=1233 ("!~*"PGUID0btf104325160123200texticregexneneqselneqjoinsel ));
464490
DATA(insertOID=1234 ("~*"PGUID0btf104225160123500texticregexeqeqseleqjoinsel ));
465491
DATA(insertOID=1235 ("!~*"PGUID0btf104225160123400texticregexneneqselneqjoinsel ));
492+
466493
DATA(insertOID=1300 ("="PGUID0btt12961296161300130113021302timestampeqeqseleqjoinsel ));
467494
DATA(insertOID=1301 ("<>"PGUID0btf12961296161301130000timestampneneqselneqjoinsel ));
468495
DATA(insertOID=1302 ("<"PGUID0btf12961296161303130500timestampltintltselintltjoinsel ));

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp