8000 Fix minmax-multi distance for extreme interval values · postgres/postgres@c6cf6d3 · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"commit":{"oid":"c6cf6d353c2865d82356ac86358622a101fde8ca","url":"/postgres/postgres/commit/c6cf6d353c2865d82356ac86358622a101fde8ca","authoredDate":"2023-10-27T17:57:44.000+02:00","committedDate":"2023-10-27T18:15:37.000+02:00","shortMessage":null,"shortMessageMarkdown":"\u003cdiv\u003eFix minmax-multi distance for extreme interval values\u003c/div\u003e","shortMessageMarkdownLink":null,"bodyMessageHtml":"When calculating distance for interval values, the code mostly mimicked\ninterval_mi, i.e. it built a new interval value for the difference.\nThat however does not work for sufficiently distant interval values,\nwhen the difference overflows the interval range.\n\nInstead, we can calculate the distance directly, without constructing\nthe intermediate (and unnecessary) interval value.\n\nBackpatch to 14, where minmax-multi indexes were introduced.\n\nReported-by: Dean Rasheed\nReviewed-by: Ashutosh Bapat, Dean Rasheed\nBackpatch-through: 14\nDiscussion: \u003ca href=\"https://postgr.es/m/eef0ea8c-4aaa-8d0d-027f-58b1f35dd170@enterprisedb.com\" rel=\"nofollow\"\u003ehttps://postgr.es/m/eef0ea8c-4aaa-8d0d-027f-58b1f35dd170@enterprisedb.com\u003c/a\u003e","authors":[{"login":"tvondra","displayName":"Tomas Vondra","avatarUrl":"https://avatars.githubusercontent.com/u/539575?v=4","path":"/tvondra","isGitHub":false}],"committerAttribution":false,"committer":{"login":"tvondra","displayName":"Tomas Vondra","avatarUrl":"https://avatars.githubusercontent.com/u/539575?v=4","path":"/tvondra","isGitHub":false},"parents":["8da86d62a11269e926765c0d6ef6f532b2b8b749"],"globalRelayId":"C_kwDOAA4m0toAKGM2Y2Y2ZDM1M2MyODY1ZDgyMzU2YWM4NjM1ODYyMmExMDFmZGU4Y2E","sha1":"8da86d62a11269e926765c0d6ef6f532b2b8b749","sha2":"c6cf6d353c2865d82356ac86358622a101fde8ca"},"currentUser":null,"repo":{"id":927442,"defaultBranch":"master","name":"postgres","ownerLogin":"postgres","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2010-09-21T11:35:45.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/177543?v=4","public":true,"private":false,"isOrgOwned":true},"diffEntryData":[{"diffLines":[{"stylingDirective":null,"type":"HUNK","blobLineNumber":2159,"text":"@@ -2160,45 +2160,20 @@ brin_minmax_multi_distance_interval(PG_FUNCTION_ARGS)","html":"@@ -2160,45 +2160,20 @@ brin_minmax_multi_distance_interval(PG_FUNCTION_ARGS)","displayNoNewLineWarning":false,"position":0,"left":2159,"right":2159},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2160,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":1,"left":2160,"right":2160},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2161,"text":" \tInterval *ia = PG_GETARG_INTERVAL_P(0);","html":" \t\u003cspan class=pl-smi\u003eInterval\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eia\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003ePG_GETARG_INTERVAL_P\u003c/span\u003e(\u003cspan class=pl-c1\u003e0\u003c/span\u003e);","displayNoNewLineWarning":false,"position":2,"left":2161,"right":2161},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2162,"text":" \tInterval *ib = PG_GETARG_INTERVAL_P(1);","html":" \t\u003cspan class=pl-smi\u003eInterval\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eib\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003ePG_GETARG_INTERVAL_P\u003c/span\u003e(\u003cspan class=pl-c1\u003e1\u003c/span\u003e);","displayNoNewLineWarning":false,"position":3,"left":2162,"right":2162},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2163,"text":"-\tInterval *result;","html":"-\t\u003cspan class=pl-smi\u003eInterval\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eresult\u003c/span\u003e;","displayNoNewLineWarning":false,"position":4,"left":2163,"right":2162},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2163,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":5,"left":2164,"right":2163},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2164,"text":" \tint64\t\tdayfraction;","html":" \t\u003cspan class=pl-smi\u003eint64\u003c/span\u003e\t\t\u003cspan class=pl-s1\u003edayfraction\u003c/span\u003e;","displayNoNewLineWarning":false,"position":6,"left":2165,"right":2164},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2165,"text":" \tint64\t\tdays;","html":" \t\u003cspan class=pl-smi\u003eint64\u003c/span\u003e\t\t\u003cspan class=pl-s1\u003edays\u003c/span\u003e;","displayNoNewLineWarning":false,"position":7,"left":2166,"right":2165},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2166,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":8,"left":2167,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2168,"text":"-\tresult = (Interval *) palloc(sizeof(Interval));","html":"-\t\u003cspan class=pl-s1\u003eresult\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003eInterval\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-en\u003epalloc\u003c/span\u003e(\u003cspan class=pl-k\u003esizeof\u003c/span\u003e(\u003cspan class=pl-s1\u003eInterval\u003c/span\u003e));","displayNoNewLineWarning":false,"position":9,"left":2168,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2169,"text":"-","html":"-","displayNoNewLineWarning":false,"position":10,"left":2169,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2170,"text":"-\tresult-\u003emonth = ib-\u003emonth - ia-\u003emonth;","html":"-\t\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e \u003cspan class=pl-c1\u003e-\u003c/span\u003e \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e;","displayNoNewLineWarning":false,"position":11,"left":2170,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2171,"text":"-\t/* overflow check copied from int4mi */","html":"-\t\u003cspan class=pl-c\u003e/* overflow check copied from int4mi */\u003c/span\u003e","displayNoNewLineWarning":false,"position":12,"left":2171,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2172,"text":"-\tif (!SAMESIGN(ib-\u003emonth, ia-\u003emonth) \u0026\u0026","html":"-\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e, \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e) \u003cspan class=pl-c1\u003e\u0026amp;\u0026amp;\u003c/span\u003e","displayNoNewLineWarning":false,"position":13,"left":2172,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2173,"text":"-\t\t!SAMESIGN(result-\u003emonth, ib-\u003emonth))","html":"-\t\t!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e, \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003emonth\u003c/span\u003e))","displayNoNewLineWarning":false,"position":14,"left":2173,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2174,"text":"-\t\tereport(ERROR,","html":"-\t\t\u003cspan class=pl-en\u003eereport\u003c/span\u003e(\u003cspan class=pl-c1\u003eERROR\u003c/span\u003e,","displayNoNewLineWarning":false,"position":15,"left":2174,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2175,"text":"-\t\t\t\t(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),","html":"-\t\t\t\t(\u003cspan class=pl-en\u003eerrcode\u003c/span\u003e(\u003cspan class=pl-c1\u003eERRCODE_DATETIME_VALUE_OUT_OF_RANGE\u003c/span\u003e),","displayNoNewLineWarning":false,"position":16,"left":2175,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2176,"text":"-\t\t\t\t errmsg(\"interval out of range\")));","html":"-\t\t\t\t \u003cspan class=pl-en\u003eerrmsg\u003c/span\u003e(\u003cspan class=pl-s\u003e\u0026quot;interval out of range\u0026quot;\u003c/span\u003e)));","displayNoNewLineWarning":false,"position":17,"left":2176,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2177,"text":"-","html":"-","displayNoNewLineWarning":false,"position":18,"left":2177,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2178,"text":"-\tresult-\u003eday = ib-\u003eday - ia-\u003eday;","html":"-\t\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e \u003cspan class=pl-c1\u003e-\u003c/span\u003e \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e;","displayNoNewLineWarning":false,"position":19,"left":2178,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2179,"text":"-\tif (!SAMESIGN(ib-\u003eday, ia-\u003eday) \u0026\u0026","html":"-\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e, \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e) \u003cspan class=pl-c1\u003e\u0026amp;\u0026amp;\u003c/span\u003e","displayNoNewLineWarning":false,"position":20,"left":2179,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2180,"text":"-\t\t!SAMESIGN(result-\u003eday, ib-\u003eday))","html":"-\t\t!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e, \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eday\u003c/span\u003e))","displayNoNewLineWarning":false,"position":21,"left":2180,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2181,"text":"-\t\tereport(ERROR,","html":"-\t\t\u003cspan class=pl-en\u003eereport\u003c/span\u003e(\u003cspan class=pl-c1\u003eERROR\u003c/span\u003e,","displayNoNewLineWarning":false,"position":22,"left":2181,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2182,"text":"-\t\t\t\t(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),","html":"-\t\t\t\t(\u003cspan class=pl-en\u003eerrcode\u003c/span\u003e(\u003cspan class=pl-c1\u003eERRCODE_DATETIME_VALUE_OUT_OF_RANGE\u003c/span\u003e),","displayNoNewLineWarning":false,"position":23,"left":2182,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2183,"text":"-\t\t\t\t errmsg(\"interval out of range\")));","html":"-\t\t\t\t \u003cspan class=pl-en\u003eerrmsg\u003c/span\u003e(\u003cspan class=pl-s\u003e\u0026quot;interval out of range\u0026quot;\u003c/span\u003e)));","displayNoNewLineWarning":false,"position":24,"left":2183,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2184,"text":"-","html":"-","displayNoNewLineWarning":false,"position":25,"left":2184,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2185,"text":"-\tresult-\u003etime = ib-\u003etime - ia-\u003etime;","html":"-\t\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e \u003cspan class=pl-c1\u003e-\u003c/span\u003e \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e;","displayNoNewLineWarning":false,"position":26,"left":2185,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2186,"text":"-\tif (!SAMESIGN(ib-\u003etime, ia-\u003etime) \u0026\u0026","html":"-\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e, \u003cspan class=pl-s1\u003eia\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e) \u003cspan class=pl-c1\u003e\u0026amp;\u0026amp;\u003c/span\u003e","displayNoNewLineWarning":false,"position":27,"left":2186,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2187,"text":"-\t\t!SAMESIGN(result-\u003etime, ib-\u003etime))","html":"-\t\t!\u003cspan class=pl-en\u003eSAMESIGN\u003c/span\u003e(\u003cspan class=pl-s1\u003eresult\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e, \u003cspan class=pl-s1\u003eib\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etime\u003c/span\u003e))","displayNoNewLineWarning":false,"position":28,"left":2187,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2188,"text":"-\t\tereport(ERROR,","html":"-\t\t\u003cspan class=pl-en\u003eereport\u003c/span\u003e(\u003cspan class=pl-c1\u003eERROR\u003c/span\u003e,","displayNoNewLineWarning":false,"position":29,"left":2188,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2189,"text":"-\t\t\t\t(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),","html":"-\t\t\t\t(\u003cspan class=pl-en\u003eerrcode\u003c/span\u003e(\u003cspan class=pl-c1\u003eERRCODE_DATETIME_VALUE_OUT_OF_RANGE\u003c/span\u003e),","displayNoNewLineWarning":false,"position":30,"left":2189,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2190,"text":"-\t\t\t\t errmsg(\"interval out of range\")));","html":"-\t\t\t\t \u003cspan class=pl-en\u003eerrmsg\u003c/span\u003e(\u003cspan class=pl-s\u003e\u0026quot;interval out of range\u0026quot;\u003c/span\u003e)));","displayNoNewLineWarning":false,"position":31,"left":2190,"right":2166},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2191,"text":"-","html":"-","displayNoNewLineWarning":false,"position":32,"left":2191,"right":2166},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2167,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":33,"left":2192,"right":2167},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2168,"text":" \t * Delta is (fractional) number of days between the intervals. Assume","html":" \u003cspan class=pl-c\u003e\t * Delta is (fractional) number of days between the intervals. Assume\u003c/span\u003e","displayNoNewLineWarning":false,"position":34,"left":2193,"right":2168},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2169,"text":" \t * months have 30 days for consistency with interval_cmp_internal. We","html":" \u003cspan class=pl-c\u003e\t * months have 30 days for consistency with interval_cmp_internal. We\u003c/span\u003e","displayNoNewLineWarning":false,"position":35,"left":2194,"right":2169},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2170,"text":" \t * don't need to be exact, in the worst case we'll build a bit less","html":" \u003cspan class=pl-c\u003e\t * don\u0026#39;t need to be exact, in the worst case we\u0026#39;ll build a bit less\u003c/span\u003e","displayNoNewLineWarning":false,"position":36,"left":2195,"right":2170},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2171,"text":" \t * efficient ranges. But we should not contradict interval_cmp.","html":" \u003cspan class=pl-c\u003e\t * efficient ranges. But we should not contradict interval_cmp.\u003c/span\u003e","displayNoNewLineWarning":false,"position":37,"left":2196,"right":2171},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2172,"text":" \t */","html":" \u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":38,"left":2197,"right":2172},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2198,"text":"-\tdayfraction = result-\u003etime % USECS_PER_DAY;","html":"-\t\u003cspan class=\"pl-s1\"\u003edayfraction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1 x x-first x-last\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etime\u003c/span\u003e % \u003cspan class=\"pl-c1\"\u003eUSECS_PER_DAY\u003c/span\u003e;","displayNoNewLineWarning":false,"position":39,"left":2198,"right":2172},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2199,"text":"-\tdays = result-\u003etime / USECS_PER_DAY;","html":"-\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1 x x-first x-last\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etime\u003c/span\u003e / \u003cspan class=\"pl-c1\"\u003eUSECS_PER_DAY\u003c/span\u003e;","displayNoNewLineWarning":false,"position":40,"left":2199,"right":2172},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2200,"text":"-\tdays += result-\u003emonth * INT64CONST(30);","html":"-\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"pl-s1 x x-first\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003emonth\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e*\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-en x\"\u003eINT64CONST\u003c/span\u003e\u003cspan class=\"x\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e30\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e)\u003c/span\u003e;","displayNoNewLineWarning":false,"position":41,"left":2200,"right":2172},{"stylingDirective":null,"type":"DELETION","blobLineNumber":2201,"text":"-\tdays += result-\u003eday;","html":"-\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"pl-s1 x x-first\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-last\"\u003eday\u003c/span\u003e;","displayNoNewLineWarning":false,"position":42,"left":2201,"right":2172},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2173,"text":"+\tdayfraction = (ib-\u003etime % USECS_PER_DAY) - (ia-\u003etime % USECS_PER_DAY);","html":"+\t\u003cspan class=\"pl-s1\"\u003edayfraction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"x x-first\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003eib\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etime\u003c/span\u003e % \u003cspan class=\"pl-c1\"\u003eUSECS_PER_DAY\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u003c/span\u003e\u003cspan class=\"x\"\u003e (\u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eia\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003etime\u003c/span\u003e\u003cspan class=\"x\"\u003e % \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003eUSECS_PER_DAY\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e)\u003c/span\u003e;","displayNoNewLineWarning":false,"position":43,"left":2201,"right":2173},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2174,"text":"+\tdays = (ib-\u003etime / USECS_PER_DAY) - (ia-\u003etime / USECS_PER_DAY);","html":"+\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"x x-first\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003eib\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etime\u003c/span\u003e / \u003cspan class=\"pl-c1\"\u003eUSECS_PER_DAY\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u003c/span\u003e\u003cspan class=\"x\"\u003e (\u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eia\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003etime\u003c/span\u003e\u003cspan class=\"x\"\u003e / \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003eUSECS_PER_DAY\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e)\u003c/span\u003e;","displayNoNewLineWarning":false,"position":44,"left":2201,"right":2174},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2175,"text":"+\tdays += (int64) ib-\u003eday - (int64) ia-\u003eday;","html":"+\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"x x-first\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi x\"\u003eint64\u003c/span\u003e\u003cspan class=\"x\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eib\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003eday\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u003c/span\u003e\u003cspan class=\"x\"\u003e (\u003c/span\u003e\u003cspan class=\"pl-smi x\"\u003eint64\u003c/span\u003e\u003cspan class=\"x\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eia\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-last\"\u003eday\u003c/span\u003e;","displayNoNewLineWarning":false,"position":45,"left":2201,"right":2175},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2176,"text":"+\tdays += ((int64) ib-\u003emonth - (int64) ia-\u003emonth) * INT64CONST(30);","html":"+\t\u003cspan class=\"pl-s1\"\u003edays\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"x x-first\"\u003e((\u003c/span\u003e\u003cspan class=\"pl-smi x\"\u003eint64\u003c/span\u003e\u003cspan class=\"x\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eib\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003emonth\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u003c/span\u003e\u003cspan class=\"x\"\u003e (\u003c/span\u003e\u003cspan class=\"pl-smi x\"\u003eint64\u003c/span\u003e\u003cspan class=\"x\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003eia\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003emonth\u003c/span\u003e\u003cspan class=\"x\"\u003e) \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e*\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-en x\"\u003eINT64CONST\u003c/span\u003e\u003cspan class=\"x\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e30\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e)\u003c/span\u003e;","displayNoNewLineWarning":false,"position":46,"left":2201,"right":2176},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2177,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":47,"left":2202,"right":2177},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2178,"text":" \t/* convert to double precision */","html":" \t\u003cspan class=pl-c\u003e/* convert to double precision */\u003c/span\u003e","displayNoNewLineWarning":false,"position":48,"left":2203,"right":2178},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2179,"text":" \tdelta = (double) days + dayfraction / (double) USECS_PER_DAY;","html":" \t\u003cspan class=pl-s1\u003edelta\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003edouble\u003c/span\u003e) \u003cspan class=pl-s1\u003edays\u003c/span\u003e \u003cspan class=pl-c1\u003e+\u003c/span\u003e \u003cspan class=pl-s1\u003edayfraction\u003c/span\u003e / (\u003cspan class=pl-smi\u003edouble\u003c/span\u003e) \u003cspan class=pl-c1\u003eUSECS_PER_DAY\u003c/span\u003e;","displayNoNewLineWarning":false,"position":49,"left":2204,"right":2179}],"diffNumber":0,"diffSize":"0 Bytes","isBinary":false,"isTooBig":false,"collapsed":false,"isSubmodule":false,"lineCount":3147,"linesChanged":33,"newTreeEntry":{"lineCount":3147,"path":"src/backend/access/brin/brin_minmax_multi.c","mode":100644,"isGenerated":false},"oldTreeEntry":{"lineCount":0,"path":"src/backend/access/brin/brin_minmax_multi.c","mode":100644},"linesAdded":4,"linesDeleted":29,"path":"src/backend/access/brin/brin_minmax_multi.c","pathDigest":"a035437992407c438bdf56d3e2b93929d865c533894d67f8b0a9c49ea656b3e5","status":"MODIFIED","truncatedReason":null,"oldOid":"8da86d62a11269e926765c0d6ef6f532b2b8b749","newOid":"c6cf6d353c2865d82356ac86358622a101fde8ca","copilotChatReference":null,"deletedSha":"8da86d62a11269e926765c0d6ef6f532b2b8b749","canToggleRichDiff":false,"defaultToRichDiff":false,"proseDifffHtml":null,"renderInfo":null,"dependencyDiffPath":null,"submodule":null},{"diffLines":[{"stylingDirective":null,"type":"HUNK","blobLineNumber":914,"text":"@@ -915,3 +915,32 @@ SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date;","html":"@@ -915,3 +915,32 @@ SELECT * FROM brin_date_test WHERE a = \u0026#39;1900-01-01\u0026#39;::date;","displayNoNewLineWarning":false,"position":0,"left":914,"right":914},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":915,"text":" DROP TABLE brin_date_test;","html":" DROP TABLE brin_date_test;","displayNoNewLineWarning":false,"position":1,"left":915,"right":915},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":916,"text":" RESET enable_seqscan;","html":" RESET enable_seqscan;","displayNoNewLineWarning":false,"position":2,"left":916,"right":916},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":917,"text":" RESET datestyle;","html":" RESET datestyle;","displayNoNewLineWarning":false,"position":3,"left":917,"right":917},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":918,"text":"+-- test handling of overflow for interval values","html":"+-- test handling of overflow for interval values","displayNoNewLineWarning":false,"position":4,"left":917,"right":918},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":919,"text":"+CREATE TABLE brin_interval_test(a INTERVAL);","html":"+CREATE TABLE brin_interval_test(a INTERVAL);","displayNoNewLineWarning":false,"position":5,"left":917,"right":919},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":920,"text":"+INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i);","html":"+INSERT INTO brin_interval_test SELECT (i || \u0026#39; years\u0026#39;)::interval FROM generate_series(-178000000, -177999980) s(i);","displayNoNewLineWarning":false,"position":6,"left":917,"right":920},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":921,"text":"+INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i);","html":"+INSERT INTO brin_interval_test SELECT (i || \u0026#39; years\u0026#39;)::interval FROM generate_series( 177999980, 178000000) s(i);","displayNoNewLineWarning":false,"position":7,"left":917,"right":921},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":922,"text":"+CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1);","html":"+CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1);","displayNoNewLineWarning":false,"position":8,"left":917,"right":922},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":923,"text":"+SET enable_seqscan = off;","html":"+SET enable_seqscan = off;","displayNoNewLineWarning":false,"position":9,"left":917,"right":923},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":924,"text":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","html":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","displayNoNewLineWarning":false,"position":10,"left":917,"right":924},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":925,"text":"+SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval;","html":"+SELECT * FROM brin_interval_test WHERE a = \u0026#39;-30 years\u0026#39;::interval;","displayNoNewLineWarning":false,"position":11,"left":917,"right":925},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":926,"text":"+ QUERY PLAN ","html":"+ QUERY PLAN ","displayNoNewLineWarning":false,"position":12,"left":917,"right":926},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":927,"text":"+-----------------------------------------------------------------------------","html":"+-----------------------------------------------------------------------------","displayNoNewLineWarning":false,"position":13,"left":917,"right":927},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":928,"text":"+ Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)","html":"+ Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)","displayNoNewLineWarning":false,"position":14,"left":917,"right":928},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":929,"text":"+ Recheck Cond: (a = '@ 30 years ago'::interval)","html":"+ Recheck Cond: (a = \u0026#39;@ 30 years ago\u0026#39;::interval)","displayNoNewLineWarning":false,"position":15,"left":917,"right":929},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":930,"text":"+ -\u003e Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)","html":"+ -\u0026gt; Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)","displayNoNewLineWarning":false,"position":16,"left":917,"right":930},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":931,"text":"+ Index Cond: (a = '@ 30 years ago'::interval)","html":"+ Index Cond: (a = \u0026#39;@ 30 years ago\u0026#39;::interval)","displayNoNewLineWarning":false,"position":17,"left":917,"right":931},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":932,"text":"+(4 rows)","html":"+(4 rows)","displayNoNewLineWarning":false,"position":18,"left":917,"right":932},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":933,"text":"+","html":"+","displayNoNewLineWarning":false,"position":19,"left":917,"right":933},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":934,"text":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","html":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","displayNoNewLineWarning":false,"position":20,"left":917,"right":934},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":935,"text":"+SELECT * FROM brin_interval_test WHERE a = '30 years'::interval;","html":"+SELECT * FROM brin_interval_test WHERE a = \u0026#39;30 years\u0026#39;::interval;","displayNoNewLineWarning":false,"position":21,"left":917,"right":935},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":936,"text":"+ QUERY PLAN ","html":"+ 8000 QUERY PLAN ","displayNoNewLineWarning":false,"position":22,"left":917,"right":936},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":937,"text":"+-----------------------------------------------------------------------------","html":"+-----------------------------------------------------------------------------","displayNoNewLineWarning":false,"position":23,"left":917,"right":937},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":938,"text":"+ Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)","html":"+ Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)","displayNoNewLineWarning":false,"position":24,"left":917,"right":938},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":939,"text":"+ Recheck Cond: (a = '@ 30 years'::interval)","html":"+ Recheck Cond: (a = \u0026#39;@ 30 years\u0026#39;::interval)","displayNoNewLineWarning":false,"position":25,"left":917,"right":939},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":940,"text":"+ -\u003e Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)","html":"+ -\u0026gt; Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)","displayNoNewLineWarning":false,"position":26,"left":917,"right":940},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":941,"text":"+ Index Cond: (a = '@ 30 years'::interval)","html":"+ Index Cond: (a = \u0026#39;@ 30 years\u0026#39;::interval)","displayNoNewLineWarning":false,"position":27,"left":917,"right":941},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":942,"text":"+(4 rows)","html":"+(4 rows)","displayNoNewLineWarning":false,"position":28,"left":917,"right":942},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":943,"text":"+","html":"+","displayNoNewLineWarning":false,"position":29,"left":917,"right":943},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":944,"text":"+DROP TABLE brin_interval_test;","html":"+DROP TABLE brin_interval_test;","displayNoNewLineWarning":false,"position":30,"left":917,"right":944},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":945,"text":"+RESET enable_seqscan;","html":"+RESET enable_seqscan;","displayNoNewLineWarning":false,"position":31,"left":917,"right":945},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":946,"text":"+RESET datestyle;","html":"+RESET datestyle;","displayNoNewLineWarning":false,"position":32,"left":917,"right":946}],"diffNumber":1,"diffSize":"0 Bytes","isBinary":false,"isTooBig":false,"collapsed":false,"isSubmodule":false,"lineCount":946,"linesChanged":29,"newTreeEntry":{"lineCount":946,"path":"src/test/regress/expected/brin_multi.out","mode":100644,"isGenerated":false},"oldTreeEntry":{"lineCount":0,"path":"src/test/regress/expected/brin_multi.out","mode":100644},"linesAdded":29,"linesDeleted":0,"path":"src/test/regress/expected/brin_multi.out","pathDigest":"3b9ff1af86645920ffde55133e1b01ffe7d99a66eda27ad5e3cd47d0e3cb85a2","status":"MODIFIED","truncatedReason":null,"oldOid":"8da86d62a11269e926765c0d6ef6f532b2b8b749","newOid":"c6cf6d353c2865d82356ac86358622a101fde8ca","copilotChatReference":null,"deletedSha":"8da86d62a11269e926765c0d6ef6f532b2b8b749","canToggleRichDiff":false,"defaultToRichDiff":false,"proseDifffHtml":null,"renderInfo":null,"dependencyDiffPath":null,"submodule":null},{"diffLines":[{"stylingDirective":null,"type":"HUNK","blobLineNumber":663,"text":"@@ -664,3 +664,24 @@ SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date;","html":"@@ -664,3 +664,24 @@ SELECT * FROM brin_date_test WHERE a = \u0026#39;1900-01-01\u0026#39;::date;","displayNoNewLineWarning":false,"position":0,"left":663,"right":663},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":664,"text":" DROP TABLE brin_date_test;","html":" \u003cspan class=\"pl-k\"\u003eDROP\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eTABLE\u003c/span\u003e brin_date_test;","displayNoNewLineWarning":false,"position":1,"left":664,"right":664},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":665,"text":" RESET enable_seqscan;","html":" RESET enable_seqscan;","displayNoNewLineWarning":false,"position":2,"left":665,"right":665},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":666,"text":" RESET datestyle;","html":" RESET datestyle;","displayNoNewLineWarning":false,"position":3,"left":666,"right":666},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":667,"text":"+","html":"+","displayNoNewLineWarning":false,"position":4,"left":666,"right":667},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":668,"text":"+-- test handling of overflow for interval values","html":"+\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e--\u003c/span\u003e test handling of overflow for interval values\u003c/span\u003e","displayNoNewLineWarning":false,"position":5,"left":666,"right":668},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":669,"text":"+CREATE TABLE brin_interval_test(a INTERVAL);","html":"+\u003cspan class=\"pl-k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eTABLE\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ebrin_interval_test\u003c/span\u003e(a INTERVAL);","displayNoNewLineWarning":false,"position":6,"left":666,"right":669},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":670,"text":"+","html":"+","displayNoNewLineWarning":false,"position":7,"left":666,"right":670},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":671,"text":"+INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i);","html":"+\u003cspan class=\"pl-k\"\u003eINSERT INTO\u003c/span\u003e brin_interval_test \u003cspan class=\"pl-k\"\u003eSELECT\u003c/span\u003e (i \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e years\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e\u003c/span\u003e)::interval \u003cspan class=\"pl-k\"\u003eFROM\u003c/span\u003e generate_series(\u003cspan class=\"pl-k\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e178000000\u003c/span\u003e, \u003cspan class=\"pl-k\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e177999980\u003c/span\u003e) s(i);","displayNoNewLineWarning":false,"position":8,"left":666,"right":671},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":672,"text":"+","html":"+","displayNoNewLineWarning":false,"position":9,"left":666,"right":672},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":673,"text":"+INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i);","html":"+\u003cspan class=\"pl-k\"\u003eINSERT INTO\u003c/span\u003e brin_interval_test \u003cspan class=\"pl-k\"\u003eSELECT\u003c/span\u003e (i \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e years\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e\u003c/span\u003e)::interval \u003cspan class=\"pl-k\"\u003eFROM\u003c/span\u003e generate_series( \u003cspan class=\"pl-c1\"\u003e177999980\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e178000000\u003c/span\u003e) s(i);","displayNoNewLineWarning":false,"position":10,"left":666,"right":673},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":674,"text":"+","html":"+","displayNoNewLineWarning":false,"position":11,"left":666,"right":674},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":675,"text":"+CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1);","html":"+\u003cspan class=\"pl-k\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eINDEX\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eON\u003c/span\u003e brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range\u003cspan class=\"pl-k\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e);","displayNoNewLineWarning":false,"position":12,"left":666,"right":675},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":676,"text":"+","html":"+","displayNoNewLineWarning":false,"position":13,"left":666,"right":676},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":677,"text":"+SET enable_seqscan = off;","html":"+\u003cspan class=\"pl-k\"\u003eSET\u003c/span\u003e enable_seqscan \u003cspan class=\"pl-k\"\u003e=\u003c/span\u003e off;","displayNoNewLineWarning":false,"position":14,"left":666,"right":677},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":678,"text":"+","html":"+","displayNoNewLineWarning":false,"position":15,"left":666,"right":678},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":679,"text":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","html":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","displayNoNewLineWarning":false,"position":16,"left":666,"right":679},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":680,"text":"+SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval;","html":"+\u003cspan class=\"pl-k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eFROM\u003c/span\u003e brin_interval_test \u003cspan class=\"pl-k\"\u003eWHERE\u003c/span\u003e a \u003cspan class=\"pl-k\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e-30 years\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e\u003c/span\u003e::interval;","displayNoNewLineWarning":false,"position":17,"left":666,"right":680},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":681,"text":"+","html":"+","displayNoNewLineWarning":false,"position":18,"left":666,"right":681},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":682,"text":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","html":"+EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)","displayNoNewLineWarning":false,"position":19,"left":666,"right":682},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":683,"text":"+SELECT * FROM brin_interval_test WHERE a = '30 years'::interval;","html":"+\u003cspan class=\"pl-k\"\u003eSELECT\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eFROM\u003c/span\u003e brin_interval_test \u003cspan class=\"pl-k\"\u003eWHERE\u003c/span\u003e a \u003cspan class=\"pl-k\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e30 years\u003cspan class=\"pl-pds\"\u003e\u0026#39;\u003c/span\u003e\u003c/span\u003e::interval;","displayNoNewLineWarning":false,"position":20,"left":666,"right":683},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":684,"text":"+","html":"+","displayNoNewLineWarning":false,"position":21,"left":666,"right":684},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":685,"text":"+DROP TABLE brin_interval_test;","html":"+\u003cspan class=\"pl-k\"\u003eDROP\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eTABLE\u003c/span\u003e brin_interval_test;","displayNoNewLineWarning":false,"position":22,"left":666,"right":685},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":686,"text":"+RESET enable_seqscan;","html":"+RESET enable_seqscan;","displayNoNewLineWarning":false,"position":23,"left":666,"right":686},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":687,"text":"+RESET datestyle;","html":"+RESET datestyle;","displayNoNewLineWarning":false,"position":24,"left":666,"right":687}],"diffNumber":2,"diffSize":"0 Bytes","isBinary":false,"isTooBig":false,"collapsed":false,"isSubmodule":false,"lineCount":687,"linesChanged":21,"newTreeEntry":{"lineCount":687,"path":"src/test/regress/sql/brin_multi.sql","mode":100644,"isGenerated":false},"oldTreeEntry":{"lineCount":0,"path":"src/test/regress/sql/brin_multi.sql","mode":100644},"linesAdded":21,"linesDeleted":0,"path":"src/test/regress/sql/brin_multi.sql","pathDigest":"6d23a95be47d5aaa953f916a2b50f86536cc3068b7ef2d6a85bee3f6262e0235","status":"MODIFIED","truncatedReason":null,"oldOid":"8da86d62a11269e926765c0d6ef6f532b2b8b749","newOid":"c6cf6d353c2865d82356ac86358622a101fde8ca","copilotChatReference":null,"deletedSha":"8da86d62a11269e926765c0d6ef6f532b2b8b749","canToggleRichDiff":false,"defaultToRichDiff":false,"proseDifffHtml":null,"renderInfo":null,"dependencyDiffPath":null,"submodule":null}],"splitViewPreference":"unified","ignoreWhitespace":false,"repoOwnerGlobalRelayId":"MDEyOk9yZ2FuaXphdGlvbjE3NzU0Mw==","commentsPreference":"visible","diffLineSpacingPreference":"relaxed","useMonospaceFont":false,"pasteUrlLinkAsPlainText":false,"userNotices":[],"path":"/postgres/postgres/commit/c6cf6d353c2865d82356ac86358622a101fde8ca","fileTreeExpanded":true,"headerInfo":{"additions":54,"deletions":29,"filesChanged":3,"filesChangedString":"3"},"moreDiffsToLoad":false,"asyncDiffLoadInfo":{"startIndex":3,"truncated":false,"byteCount":4493,"lineShownCount":108},"commentInfo":{"canComment":false,"locked":false,"canLock":false,"repoArchived":false},"csrf_tokens":{"/users/diffview?diff=split":{"post":"Y0pNtu7cvU3X1Ye29_-pLnengihYmBftPEtye5OpAg9_vIHsQWxiY7b7dm3X7vMDiopf8Fzp9gY_sYbYntXikQ"},"/users/diffview?diff=unified":{"post":"ddzrH8sH9JZc4qaENxMkQrp8zlo4W3-xz67zylV_S7RpKidFZLcruD3MV18XAn5vR1ETgjwqnlrMVAdpWAOrKg"},"/notifications/thread":{"post":"kbzim7l_X2BILOrzfj-h0IOk0NhEKiEnHqrZwVkyEweJV9axIFUIu-Z5v4osMb58Fm7pLwVXlbzjNceYIVqhkQ"}}},"title":"Fix minmax-multi distance for extreme interval values · postgres/postgres@c6cf6d3","appPayload":{"helpUrl":"https://docs.github.com","findInDiffWorkerPath":"/assets-cdn/worker/find-in-diff-worker-2bfe39677d14.js","enabled_features":{"diff_ux_refresh_beta":false,"diff_inline_comments":true,"diff_ux_refresh_ssr_five":false,"diff_ux_refresh_ssr_ten":false,"react_diff_line_type_character_correction":true}}}

Commit c6cf6d3

Browse files
committed
Fix minmax-multi distance for extreme interval values
When calculating distance for interval values, the code mostly mimicked interval_mi, i.e. it built a new interval value for the difference. That however does not work for sufficiently distant interval values, when the difference overflows the interval range. Instead, we can calculate the distance directly, without constructing the intermediate (and unnecessary) interval value. Backpatch to 14, where minmax-multi indexes were introduced. Reported-by: Dean Rasheed Reviewed-by: Ashutosh Bapat, Dean Rasheed Backpatch-through: 14 Discussion: https://postgr.es/m/eef0ea8c-4aaa-8d0d-027f-58b1f35dd170@enterprisedb.com
1 parent 8da86d6 commit c6cf6d3

File tree

3 files changed

+54
-29
lines changed

3 files changed

+54
-29
lines changed

src/backend/access/brin/brin_minmax_multi.c

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2160,45 +2160,20 @@ brin_minmax_multi_distance_interval(PG_FUNCTION_ARGS)
21602160

21612161
Interval *ia = PG_GETARG_INTERVAL_P(0);
21622162
Interval *ib = PG_GETARG_INTERVAL_P(1);
2163-
Interval *result;
21642163

21652164
int64 dayfraction;
21662165
int64 days;
21672166

2168-
result = (Interval *) palloc(sizeof(Interval));
2169-
2170-
result->month = ib->month - ia->month;
2171-
/* overflow check copied from int4mi */
2172-
if (!SAMESIGN(ib->month, ia->month) &&
2173-
!SAMESIGN(result->month, ib->month))
2174-
ereport(ERROR,
2175-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2176-
errmsg("interval out of range")));
2177-
2178-
result->day = ib->day - ia->day;
2179-
if (!SAMESIGN(ib->day, ia->day) &&
2180-
!SAMESIGN(result->day, ib->day))
2181-
ereport(ERROR,
2182-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2183-
errmsg("interval out of range")));
2184-
2185-
result->time = ib->time - ia->time;
2186-
if (!SAMESIGN(ib->time, ia->time) &&
2187-
!SAMESIGN(result->time, ib->time))
2188-
ereport(ERROR,
2189-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2190-
errmsg("interval out of range")));
2191-
21922167
/*
21932168
* Delta is (fractional) number of days between the intervals. Assume
21942169
* months have 30 days for consistency with interval_cmp_internal. We
21952170
* don't need to be exact, in the worst case we'll build a bit less
21962171
* efficient ranges. But we should not contradict interval_cmp.
21972172
*/
2198-
dayfraction = result->time % USECS_PER_DAY;
2199-
days = result->time 10000 / USECS_PER_DAY;
2200-
days += result->month * INT64CONST(30);
2201-
days += result->day;
2173+
dayfraction = (ib->time % USECS_PER_DAY) - (ia->time % USECS_PER_DAY);
2174+
days = (ib->time / USECS_PER_DAY) - (ia->time / USECS_PER_DAY);
2175+
days += (int64) ib->day - (int64) ia->day;
2176+
days += ((int64) ib->month - (int64) ia->month) * INT64CONST(30);
22022177

22032178
/* convert to double precision */
22042179
delta = (double) days + dayfraction / (double) USECS_PER_DAY;

src/test/regress/expected/brin_multi.out

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,3 +915,32 @@ SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date;
915915
DROP TABLE brin_date_test;
916916
RESET enable_seqscan;
917917
RESET datestyle;
918+
-- test handling of overflow for interval values
919+
CREATE TABLE brin_interval_test(a INTERVAL);
920+
INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i);
921+
INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i);
922+
CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1);
923+
SET enable_seqscan = off;
924+
EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)
925+
SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval;
926+
QUERY PLAN
927+
-----------------------------------------------------------------------------
928+
Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)
929+
Recheck Cond: (a = '@ 30 years ago'::interval)
930+
-> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)
931+
Index Cond: (a = '@ 30 years ago'::interval)
932+
(4 rows)
933+
934+
EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)
935+
SELECT * FROM brin_interval_test WHERE a = '30 years'::interval;
936+
QUERY PLAN
937+
-----------------------------------------------------------------------------
938+
Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1)
939+
Recheck Cond: (a = '@ 30 years'::interval)
940+
-> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1)
941+
Index Cond: (a = '@ 30 years'::interval)
942+
(4 rows)
943+
944+
DROP TABLE brin_interval_test;
945+
RESET enable_seqscan;
946+
RESET datestyle;

src/test/regress/sql/brin_multi.sql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,3 +664,24 @@ SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date;
664664
DROP TABLE brin_date_test;
665665
RESET enable_seqscan;
666666
RESET datestyle;
667+
668+
-- test handling of overflow for interval values
669+
CREATE TABLE brin_interval_test(a INTERVAL);
670+
671+
INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i);
672+
673+
INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i);
674+
675+
CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1);
676+
677+
SET enable_seqscan = off;
678+
679+
EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)
680+
SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval;
681+
682+
EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF)
683+
SELECT * FROM brin_interval_test WHERE a = '30 years'::interval;
684+
685+
DROP TABLE brin_interval_test;
686+
RESET enable_seqscan;
687+
RESET datestyle;

0 commit comments

Comments
 (0)
0