From 89870cc439deb1d4562d2526b9502dae86bb639d Mon Sep 17 00:00:00 2001 From: Bborie Park Date: Mon, 18 Jun 2012 22:47:52 +0000 Subject: [PATCH] When no pixels are counted for summary stats, all other elements of stats output should be NULL. Ticket is #1875 git-svn-id: http://svn.osgeo.org/postgis/trunk@9943 b70326c6-7e19-0410-871a-916f4a2858ee --- raster/rt_pg/rt_pg.c | 48 +++++++++++++------- raster/test/regress/rt_asraster_expected | 2 +- raster/test/regress/rt_summarystats_expected | 4 +- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index 6a5a85d9d..1e3fd84d1 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -4454,9 +4454,9 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS) rt_bandstats stats = NULL; TupleDesc tupdesc; - bool *nulls = NULL; int values_length = 6; Datum values[values_length]; + bool nulls[values_length]; HeapTuple tuple; Datum result; @@ -4534,15 +4534,23 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS) BlessTupleDesc(tupdesc); - nulls = palloc(sizeof(bool) * values_length); memset(nulls, FALSE, values_length); values[0] = Int64GetDatum(stats->count); - values[1] = Float8GetDatum(stats->sum); - values[2] = Float8GetDatum(stats->mean); - values[3] = Float8GetDatum(stats->stddev); - values[4] = Float8GetDatum(stats->min); - values[5] = Float8GetDatum(stats->max); + if (stats->count > 0) { + values[1] = Float8GetDatum(stats->sum); + values[2] = Float8GetDatum(stats->mean); + values[3] = Float8GetDatum(stats->stddev); + values[4] = Float8GetDatum(stats->min); + values[5] = Float8GetDatum(stats->max); + } + else { + nulls[1] = TRUE; + nulls[2] = TRUE; + nulls[3] = TRUE; + nulls[4] = TRUE; + nulls[5] = TRUE; + } /* build a tuple */ tuple = heap_form_tuple(tupdesc, values, nulls); @@ -4551,7 +4559,6 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS) result = HeapTupleGetDatum(tuple); /* clean up */ - pfree(nulls); pfree(stats); PG_RETURN_DATUM(result); @@ -4591,9 +4598,9 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS) rt_bandstats stats = NULL; rt_bandstats rtn = NULL; - bool *nulls = NULL; - Datum values[6]; int values_length = 6; + Datum values[values_length]; + bool nulls[values_length]; Datum result; /* tablename is null, return null */ @@ -4829,15 +4836,23 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS) BlessTupleDesc(tupdesc); - nulls = palloc(sizeof(bool) * values_length); memset(nulls, FALSE, values_length); values[0] = Int64GetDatum(rtn->count); - values[1] = Float8GetDatum(rtn->sum); - values[2] = Float8GetDatum(rtn->mean); - values[3] = Float8GetDatum(rtn->stddev); - values[4] = Float8GetDatum(rtn->min); - values[5] = Float8GetDatum(rtn->max); + if (rtn->count > 0) { + values[1] = Float8GetDatum(rtn->sum); + values[2] = Float8GetDatum(rtn->mean); + values[3] = Float8GetDatum(rtn->stddev); + values[4] = Float8GetDatum(rtn->min); + values[5] = Float8GetDatum(rtn->max); + } + else { + nulls[1] = TRUE; + nulls[2] = TRUE; + nulls[3] = TRUE; + nulls[4] = TRUE; + nulls[5] = TRUE; + } /* build a tuple */ tuple = heap_form_tuple(tupdesc, values, nulls); @@ -4846,7 +4861,6 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS) result = HeapTupleGetDatum(tuple); /* clean up */ - pfree(nulls); pfree(rtn); PG_RETURN_DATUM(result); diff --git a/raster/test/regress/rt_asraster_expected b/raster/test/regress/rt_asraster_expected index 9f63543bc..f9b6b4556 100644 --- a/raster/test/regress/rt_asraster_expected +++ b/raster/test/regress/rt_asraster_expected @@ -27,7 +27,7 @@ NOTICE: The two rasters provided have different scales on the X axis 1.18|993310|10|10|2|14065.366|-8691.142|0.000|0.000|-175453.086|114987.661|8BUI|0.000|t|255.000|255.000| 1.19|993310|141|87|3|1000.000|-1000.000|0.000|0.000|-175453.086|114987.661|32BF||t|0.000|255.000| 1.2|993310|1407|869|1|100.000|-100.000|0.000|0.000|-175453.086|114987.661|8BUI|0.000|t|1.000|1.000| -1.20|993310|141|87|2|1000.000|-1000.000|0.000|0.000|-175453.086|114987.661|8BUI|1.000|f|0.000|0.000| +1.20|993310|141|87|2|1000.000|-1000.000|0.000|0.000|-175453.086|114987.661|8BUI|1.000|f||| 1.3|993310|500|500|1|281.307|-173.823|0.000|0.000|-175453.086|114987.661|8BUI|0.000|t|1.000|1.000| 1.4|993310|141|87|1|1000.000|-1000.000|0.000|0.000|-175453.086|114987.661|8BUI|0.000|t|1.000|1.000| 1.5|993310|141|87|1|1000.000|-1000.000|0.000|0.000|-175453.086|114987.661|16BSI|0.000|t|1.000|1.000| diff --git a/raster/test/regress/rt_summarystats_expected b/raster/test/regress/rt_summarystats_expected index 339f3dd92..ab36e5a99 100644 --- a/raster/test/regress/rt_summarystats_expected +++ b/raster/test/regress/rt_summarystats_expected @@ -5,9 +5,9 @@ -0.069|1.046 NOTICE: Invalid band index (must use 1-based). Returning NULL | -(0,0,0,-1,0,0) +(0,,,,,) NOTICE: Band is empty as width and/or height is 0 -(0,0,0,-1,0,0) +(0,,,,,) BEGIN 20|-68.584|-3.429|6.571|-10.000|3.142 1000|-68.584|-0.069|1.046|-10.000|3.142 -- 2.40.0