Turns out you can specify negative values using plurals:
https://english.stackexchange.com/questions/9735/is-1-followed-by-a-singular-or-plural-noun
so the previous code was correct enough, and consistent with other usage
in our code. Also add comment in the two places where this could be
confused.
Reported-by: Noah Misch
Diagnosed-by: [email protected]
FROM dblink('myconn',
'SELECT * FROM (VALUES (''-1 2:03:04'')) i')
AS i(i interval);
- i
-------------------
- -1 day -02:03:04
+ i
+-------------------
+ -1 days -02:03:04
(1 row)
-- Try swapping to another format to ensure the GUCs are tracked
(*is_before && value > 0) ? "+" : "",
value,
units,
- (abs(value) != 1) ? "s" : "");
+ (value != 1) ? "s" : "");
/*
* Each nonzero field sets is_before for (only) the next one. This is a
}
else if (*is_before)
value = -value;
- sprintf(cp, " %d %s%s", value, units, (abs(value) == 1) ? "" : "s");
+ sprintf(cp, " %d %s%s", value, units, (value == 1) ? "" : "s");
*is_zero = false;
return cp + strlen(cp);
}
else if (is_before)
*cp++ = '-';
cp = AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
+ /* We output "ago", not negatives, so use abs(). */
sprintf(cp, " sec%s",
(abs(sec) != 1 || fsec != 0) ? "s" : "");
is_zero = false;
}
else if (*is_before)
value = -value;
- sprintf(cp, " %d %s%s", value, units, (abs(value) == 1) ? "" : "s");
+ sprintf(cp, " %d %s%s", value, units, (value == 1) ? "" : "s");
*is_zero = false;
return cp + strlen(cp);
}
(*is_before && value > 0) ? "+" : "",
value,
units,
- (abs(value) != 1) ? "s" : "");
+ (value != 1) ? "s" : "");
/*
* Each nonzero field sets is_before for (only) the next one. This is a
*cp++ = '-';
AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
cp += strlen(cp);
+ /* We output "ago", not negatives, so use abs(). */
sprintf(cp, " sec%s",
(abs(sec) != 1 || fsec != 0) ? "s" : "");
is_zero = false;
}
if (po->header && !po->html3)
fprintf(fout, "(%d row%s)\n\n", PQntuples(res),
- (abs(PQntuples(res)) == 1) ? "" : "s");
+ (PQntuples(res) == 1) ? "" : "s");
if (po->html3 && !po->expanded)
fputs("\n", fout);
free(fieldMax);
if (!quiet)
fprintf(fp, "\nQuery returned %d row%s.\n", PQntuples(res),
- (abs(PQntuples(res)) == 1) ? "" : "s");
+ (PQntuples(res) == 1) ? "" : "s");
fflush(fp);
(1 row)
SELECT INTERVAL '-1 +02:03' AS "22 hours ago...";
- 22 hours ago...
-------------------
- -1 day +02:03:00
+ 22 hours ago...
+-------------------
+ -1 days +02:03:00
(1 row)
SELECT INTERVAL '-1 days +02:03' AS "22 hours ago...";
- 22 hours ago...
-------------------
- -1 day +02:03:00
+ 22 hours ago...
+-------------------
+ -1 days +02:03:00
(1 row)
SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours";
product
------------------------------------
1 year 12 days 122:24:00
- -1 year -12 days +93:36:00
+ -1 years -12 days +93:36:00
-3 days -14:24:00
2 mons 13 days 01:22:28.8
-10 mons +120 days 37:28:21.6567
----------------------------------
4 mons 4 days 40:48:00
-4 mons -4 days +31:12:00
- -1 day -04:48:00
+ -1 days -04:48:00
25 days -15:32:30.4
-3 mons +30 days 12:29:27.2189
12 days
interval '-1 +1:00:00',
interval '+1-2 -3 +4:05:06.789',
interval '-1-2 +3 -4:05:06.789';
- interval | interval | interval | interval
------------------+------------------+-------------------------------------+---------------------------------------
- 1 day -01:00:00 | -1 day +01:00:00 | 1 year 2 mons -3 days +04:05:06.789 | -1 year -2 mons +3 days -04:05:06.789
+ interval | interval | interval | interval
+-----------------+-------------------+-------------------------------------+----------------------------------------
+ 1 day -01:00:00 | -1 days +01:00:00 | 1 year 2 mons -3 days +04:05:06.789 | -1 years -2 mons +3 days -04:05:06.789
(1 row)
-- test output of couple non-standard interval values in the sql style