From ddd2b4e3bf7f8a16646e68f4fcc4019d0ad93ab9 Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Tue, 31 Oct 2017 14:48:48 +0100 Subject: [PATCH 1/7] Makefile: Add support for PARALLEL categories --- Makefile.global | 3 +++ src/pg/Makefile | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/Makefile.global b/Makefile.global index 140d486..135571b 100644 --- a/Makefile.global +++ b/Makefile.global @@ -6,3 +6,6 @@ RELEASE_VERSION ?= $(EXTVERSION) SED = sed PIP = pip NOSETESTS = nosetests +AWK = awk +PG_CONFIG = pg_config +PG_PARALLEL := $(shell $(PG_CONFIG) --version | ($(AWK) '{$$2*=1000; if ($$2 >= 9600) print 1; else print 0;}' 2> /dev/null || echo 0)) diff --git a/src/pg/Makefile b/src/pg/Makefile index c6fe484..32f543b 100644 --- a/src/pg/Makefile +++ b/src/pg/Makefile @@ -23,6 +23,13 @@ REPLACEMENTS = -e 's/@@VERSION@@/$(EXTVERSION)/g' $(DATA): $(SOURCES_DATA) $(SED) $(REPLACEMENTS) $(SOURCES_DATA_DIR)/*.sql > $@ +ifeq ($(PG_PARALLEL), 0) +# Remove PARALLEL in aggregates and functions + $(eval TMPFILE := $(shell mktemp /tmp/$(basename $0).XXXXXXXX)) + $(SED) -e 's/PARALLEL \= [A-Z]*,/''/g' \ + -e 's/PARALLEL [A-Z]*/''/g' $@ > $(TMPFILE) + mv $(TMPFILE) $@ +endif TEST_DIR = test REGRESS = $(sort $(notdir $(basename $(wildcard $(TEST_DIR)/sql/*test.sql)))) From 0a15857a548d38e38d09aac7e1cf48b8ffbccd37 Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Tue, 31 Oct 2017 18:07:10 +0100 Subject: [PATCH 2/7] Add PARALLEL and VOLATILE categories to PG functions --- src/pg/sql/01_version.sql | 4 ++-- src/pg/sql/03_random_seeds.sql | 2 +- src/pg/sql/04_py_agg.sql | 3 ++- src/pg/sql/05_segmentation.sql | 4 ++-- src/pg/sql/07_gravity.sql | 4 ++-- src/pg/sql/08_interpolation.sql | 4 ++-- src/pg/sql/09_voronoi.sql | 9 +++------ src/pg/sql/10_moran.sql | 24 ++++++++++++------------ src/pg/sql/11_kmeans.sql | 7 ++++--- src/pg/sql/11_markov.sql | 2 +- src/pg/sql/13_PIA.sql | 4 ++-- src/pg/sql/14_densify.sql | 2 +- src/pg/sql/15_tinmap.sql | 2 +- src/pg/sql/16_getis.sql | 2 +- src/pg/sql/18_outliers.sql | 6 +++--- src/pg/sql/19_contour.sql | 5 ++--- src/pg/sql/20_overlap_sum.sql | 2 +- src/pg/sql/30_dot_density.sql | 2 +- src/pg/sql/cdb_utils.sql | 12 ++++++------ 19 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/pg/sql/01_version.sql b/src/pg/sql/01_version.sql index f73c764..ec46f66 100644 --- a/src/pg/sql/01_version.sql +++ b/src/pg/sql/01_version.sql @@ -2,11 +2,11 @@ CREATE OR REPLACE FUNCTION cdb_crankshaft_version() RETURNS text AS $$ SELECT '@@VERSION@@'::text; -$$ language 'sql' STABLE STRICT; +$$ language 'sql' IMMUTABLE STRICT PARALLEL SAFE; -- Internal identifier of the installed extension instence -- e.g. 'dev' for current development version CREATE OR REPLACE FUNCTION _cdb_crankshaft_internal_version() RETURNS text AS $$ SELECT installed_version FROM pg_available_extensions where name='crankshaft' and pg_available_extensions IS NOT NULL; -$$ language 'sql' STABLE STRICT; +$$ language 'sql' STABLE STRICT PARALLEL SAFE; diff --git a/src/pg/sql/03_random_seeds.sql b/src/pg/sql/03_random_seeds.sql index 2b62be3..6607398 100644 --- a/src/pg/sql/03_random_seeds.sql +++ b/src/pg/sql/03_random_seeds.sql @@ -6,4 +6,4 @@ _cdb_random_seeds (seed_value INTEGER) RETURNS VOID AS $$ from crankshaft import random_seeds random_seeds.set_random_seeds(seed_value) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; diff --git a/src/pg/sql/04_py_agg.sql b/src/pg/sql/04_py_agg.sql index a3e881b..e08efdc 100644 --- a/src/pg/sql/04_py_agg.sql +++ b/src/pg/sql/04_py_agg.sql @@ -8,7 +8,7 @@ CREATE OR REPLACE FUNCTION end if; return array_cat(current_state,current_row) ; END - $$ LANGUAGE plpgsql; + $$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; -- Create aggregate if it did not exist DO $$ @@ -24,6 +24,7 @@ BEGIN CREATE AGGREGATE CDB_PyAgg(NUMERIC[]) ( SFUNC = CDB_PyAggS, STYPE = Numeric[], + PARALLEL = SAFE, INITCOND = "{}" ); END IF; diff --git a/src/pg/sql/05_segmentation.sql b/src/pg/sql/05_segmentation.sql index 7dac003..7fe9bf8 100644 --- a/src/pg/sql/05_segmentation.sql +++ b/src/pg/sql/05_segmentation.sql @@ -33,7 +33,7 @@ AS $$ target_ids, model_params) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL RESTRICTED; CREATE OR REPLACE FUNCTION CDB_CreateAndPredictSegment ( @@ -50,4 +50,4 @@ AS $$ from crankshaft.segmentation import create_and_predict_segment model_params = {'n_estimators': n_estimators, 'max_depth':max_depth, 'subsample' : subsample, 'learning_rate': learning_rate, 'min_samples_leaf' : min_samples_leaf} return create_and_predict_segment(query,variable_name,target_table, model_params) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; diff --git a/src/pg/sql/07_gravity.sql b/src/pg/sql/07_gravity.sql index 47e5b8e..f74cc97 100644 --- a/src/pg/sql/07_gravity.sql +++ b/src/pg/sql/07_gravity.sql @@ -27,7 +27,7 @@ BEGIN RETURN QUERY SELECT g.* FROM t, s, CDB_Gravity(t_id, t_geom, t_weight, s_id, s_geom, s_pop, target, radius, minval) g; END; -$$ language plpgsql; +$$ language plpgsql VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION CDB_Gravity( IN t_id bigint[], @@ -112,4 +112,4 @@ BEGIN p.targ_id = target AND p.sourc_id = d.sourc_id; END; -$$ language plpgsql; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/08_interpolation.sql b/src/pg/sql/08_interpolation.sql index cb0a20a..12ad37f 100644 --- a/src/pg/sql/08_interpolation.sql +++ b/src/pg/sql/08_interpolation.sql @@ -24,7 +24,7 @@ BEGIN RETURN output; END; $$ -language plpgsql IMMUTABLE; +language plpgsql VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION CDB_SpatialInterpolation( IN geomin geometry[], @@ -141,4 +141,4 @@ BEGIN END; $$ -language plpgsql IMMUTABLE; +language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/09_voronoi.sql b/src/pg/sql/09_voronoi.sql index 361525c..02d2463 100644 --- a/src/pg/sql/09_voronoi.sql +++ b/src/pg/sql/09_voronoi.sql @@ -167,7 +167,7 @@ BEGIN clipped_voro; RETURN geomout; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; /** ---------------------------------------------------------------------------------------- * @function : FindCircle @@ -181,6 +181,7 @@ $$ language plpgsql IMMUTABLE; * or NULL if three points do not form a circle. * @history : Simon Greener - Feb 2012 - Original coding. * Rafa de la Torre - Aug 2016 - Small fix for type checking + * Raul Marin - Sept 2017 - Remove unnecessary NULL checks and set function categories * @copyright : Simon Greener @ 2012 * Licensed under a Creative Commons Attribution-Share Alike 2.5 Australia License. (http://creativecommons.org/licenses/by-sa/2.5/au/) **/ @@ -203,10 +204,6 @@ DECLARE v_dF NUMERIC; v_dG NUMERIC; BEGIN - IF ( p_pt1 IS NULL OR p_pt2 IS NULL OR p_pt3 IS NULL ) THEN - RAISE EXCEPTION 'All supplied points must be not null.'; - RETURN NULL; - END IF; IF ( ST_GeometryType(p_pt1) <> 'ST_Point' OR ST_GeometryType(p_pt2) <> 'ST_Point' OR ST_GeometryType(p_pt3) <> 'ST_Point' ) THEN @@ -232,5 +229,5 @@ BEGIN RETURN ST_SetSRID(ST_MakePoint(v_CX, v_CY, v_radius),ST_Srid(p_pt1)); END; $BODY$ - LANGUAGE plpgsql VOLATILE STRICT; + LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/src/pg/sql/10_moran.sql b/src/pg/sql/10_moran.sql index bd3f96d..840e07b 100644 --- a/src/pg/sql/10_moran.sql +++ b/src/pg/sql/10_moran.sql @@ -15,7 +15,7 @@ AS $$ moran = Moran() return moran.global_stat(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- Moran's I Local (internal function) CREATE OR REPLACE FUNCTION @@ -34,7 +34,7 @@ AS $$ # TODO: use named parameters or a dictionary return moran.local_stat(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- Moran's I Local (public-facing function) CREATE OR REPLACE FUNCTION @@ -52,7 +52,7 @@ AS $$ SELECT moran, quads, significance, rowid, vals FROM cdb_crankshaft._CDB_AreasOfInterestLocal(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I only for HH and HL (public-facing function) CREATE OR REPLACE FUNCTION @@ -71,7 +71,7 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocal(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('HH', 'HL'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I only for LL and LH (public-facing function) CREATE OR REPLACE FUNCTION @@ -90,7 +90,7 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocal(subquery, attr, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('LL', 'LH'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I only for LH and HL (public-facing function) CREATE OR REPLACE FUNCTION @@ -109,7 +109,7 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocal(subquery, attr, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('HL', 'LH'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I Global Rate (public-facing function) CREATE OR REPLACE FUNCTION @@ -129,7 +129,7 @@ AS $$ # TODO: use named parameters or a dictionary return moran.global_rate_stat(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- Moran's I Local Rate (internal function) @@ -150,7 +150,7 @@ AS $$ moran = Moran() # TODO: use named parameters or a dictionary return moran.local_rate_stat(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- Moran's I Local Rate (public-facing function) CREATE OR REPLACE FUNCTION @@ -170,7 +170,7 @@ AS $$ SELECT moran, quads, significance, rowid, vals FROM cdb_crankshaft._CDB_AreasOfInterestLocalRate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I Local Rate only for HH and HL (public-facing function) CREATE OR REPLACE FUNCTION @@ -191,7 +191,7 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocalRate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('HH', 'HL'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I Local Rate only for LL and LH (public-facing function) CREATE OR REPLACE FUNCTION @@ -212,7 +212,7 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocalRate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('LL', 'LH'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Moran's I Local Rate only for LH and HL (public-facing function) CREATE OR REPLACE FUNCTION @@ -233,4 +233,4 @@ AS $$ FROM cdb_crankshaft._CDB_AreasOfInterestLocalRate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) WHERE quads IN ('HL', 'LH'); -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; diff --git a/src/pg/sql/11_kmeans.sql b/src/pg/sql/11_kmeans.sql index 0899e81..1a01e03 100644 --- a/src/pg/sql/11_kmeans.sql +++ b/src/pg/sql/11_kmeans.sql @@ -7,7 +7,7 @@ RETURNS table (cartodb_id integer, cluster_no integer) as $$ kmeans = Kmeans() return kmeans.spatial(query, no_clusters, no_init) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION CDB_WeightedMeanS(state Numeric[],the_geom GEOMETRY(Point, 4326), weight NUMERIC) @@ -30,7 +30,7 @@ BEGIN RETURN Array[newX,newY,newW]; END -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION CDB_WeightedMeanF(state Numeric[]) RETURNS GEOMETRY AS @@ -42,7 +42,7 @@ BEGIN RETURN ST_SETSRID(ST_MakePoint(state[1]/state[3], state[2]/state[3]),4326); END IF; END -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; -- Create aggregate if it did not exist DO $$ @@ -59,6 +59,7 @@ BEGIN SFUNC = CDB_WeightedMeanS, FINALFUNC = CDB_WeightedMeanF, STYPE = Numeric[], + PARALLEL = SAFE, INITCOND = "{0.0,0.0,0.0}" ); END IF; diff --git a/src/pg/sql/11_markov.sql b/src/pg/sql/11_markov.sql index da02c66..0a930c3 100644 --- a/src/pg/sql/11_markov.sql +++ b/src/pg/sql/11_markov.sql @@ -27,7 +27,7 @@ AS $$ ## TODO: use named parameters or a dictionary return markov.spatial_trend(subquery, time_cols, num_classes, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- input table format: identical to above but in a predictable format -- Sample function call: diff --git a/src/pg/sql/13_PIA.sql b/src/pg/sql/13_PIA.sql index d9a224d..71b95b2 100644 --- a/src/pg/sql/13_PIA.sql +++ b/src/pg/sql/13_PIA.sql @@ -91,7 +91,7 @@ BEGIN RETURN ST_transform(ST_Centroid(best_c), 4326); END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; -- signed distance point to polygon with holes @@ -120,4 +120,4 @@ BEGIN dist := dist * within::numeric; RETURN dist; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/14_densify.sql b/src/pg/sql/14_densify.sql index 47a200e..c6d9493 100644 --- a/src/pg/sql/14_densify.sql +++ b/src/pg/sql/14_densify.sql @@ -64,4 +64,4 @@ BEGIN END LOOP; RETURN QUERY SELECT unnest(geotemp ) as geomout, unnest(coltemp ) as colout; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/15_tinmap.sql b/src/pg/sql/15_tinmap.sql index 493c9cf..dd80aee 100644 --- a/src/pg/sql/15_tinmap.sql +++ b/src/pg/sql/15_tinmap.sql @@ -40,4 +40,4 @@ BEGIN END LOOP; RETURN QUERY SELECT unnest(gs) as geomout, unnest(coltemp ) as colout; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/16_getis.sql b/src/pg/sql/16_getis.sql index e520227..b5feb9f 100644 --- a/src/pg/sql/16_getis.sql +++ b/src/pg/sql/16_getis.sql @@ -14,6 +14,6 @@ AS $$ from crankshaft.clustering import Getis getis = Getis() return getis.getis_ord(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; -- TODO: make a version that accepts the values as arrays diff --git a/src/pg/sql/18_outliers.sql b/src/pg/sql/18_outliers.sql index 5b23c77..b532606 100644 --- a/src/pg/sql/18_outliers.sql +++ b/src/pg/sql/18_outliers.sql @@ -9,7 +9,7 @@ BEGIN RETURN column_value > threshold; END; -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE ; -- Find outliers by a percentage above the threshold -- TODO: add symmetric option? `is_symmetric boolean DEFAULT false` @@ -38,7 +38,7 @@ BEGIN unnest(ids) As rowid; END; -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; -- Find outliers above a given number of standard deviations from the mean @@ -72,4 +72,4 @@ BEGIN SELECT unnest(out_vals) As is_outlier, unnest(ids) As rowid; END; -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/19_contour.sql b/src/pg/sql/19_contour.sql index 78f0cfd..f48fad3 100644 --- a/src/pg/sql/19_contour.sql +++ b/src/pg/sql/19_contour.sql @@ -139,8 +139,7 @@ BEGIN where final.bin is not null ; END; -$$ language plpgsql; - +$$ language plpgsql VOLATILE PARALLEL RESTRICTED; -- ===================================================================== @@ -205,4 +204,4 @@ BEGIN RETURN output; END; $$ -language plpgsql; +language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/src/pg/sql/20_overlap_sum.sql b/src/pg/sql/20_overlap_sum.sql index 203be39..e39b387 100644 --- a/src/pg/sql/20_overlap_sum.sql +++ b/src/pg/sql/20_overlap_sum.sql @@ -35,4 +35,4 @@ BEGIN INTO result; RETURN result; END; -$$ LANGUAGE plpgsql; +$$ LANGUAGE plpgsql STABLE PARALLEL SAFE; diff --git a/src/pg/sql/30_dot_density.sql b/src/pg/sql/30_dot_density.sql index b0f3604..11a24c4 100644 --- a/src/pg/sql/30_dot_density.sql +++ b/src/pg/sql/30_dot_density.sql @@ -51,4 +51,4 @@ BEGIN RETURN ST_Collect(points); END; $$ -LANGUAGE plpgsql VOLATILE; +LANGUAGE plpgsql VOLATILE PARALLEL RESTRICTED; diff --git a/src/pg/sql/cdb_utils.sql b/src/pg/sql/cdb_utils.sql index 8f87084..9d6fa47 100644 --- a/src/pg/sql/cdb_utils.sql +++ b/src/pg/sql/cdb_utils.sql @@ -93,7 +93,7 @@ BEGIN RETURN; END -$$ LANGUAGE 'plpgsql' IMMUTABLE; +$$ LANGUAGE 'plpgsql' IMMUTABLE PARALLEL SAFE; -- -- Calculate the equal interval bins for a given column @@ -131,7 +131,7 @@ BEGIN END LOOP; RETURN reply; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; -- -- Determine the Heads/Tails classifications from a numeric array @@ -178,7 +178,7 @@ BEGIN END LOOP; RETURN reply; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; -- -- Determine the Jenks classifications from a numeric array @@ -299,7 +299,7 @@ BEGIN RETURN (best_result)[2:array_upper(best_result, 1)]; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql VOLATILE PARALLEL RESTRICTED; @@ -399,7 +399,7 @@ BEGIN RETURN array_prepend(gvf, reply); END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; -- @@ -444,4 +444,4 @@ BEGIN END LOOP; RETURN reply; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; From e71e9b10b616b751b7c92a46087345fed483f275 Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Thu, 2 Nov 2017 12:29:14 +0100 Subject: [PATCH 3/7] Avoid regress error with exceptions under some verbosity levels --- src/pg/test/sql/18_outliers_test.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pg/test/sql/18_outliers_test.sql b/src/pg/test/sql/18_outliers_test.sql index 9a6b87d..cb216ea 100644 --- a/src/pg/test/sql/18_outliers_test.sql +++ b/src/pg/test/sql/18_outliers_test.sql @@ -1,5 +1,6 @@ SET client_min_messages TO WARNING; \set ECHO none +\set VERBOSITY TERSE \pset format unaligned -- From 1508e5090ccd36e7b15b39cf6996d6568fc7463c Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Wed, 8 Nov 2017 16:47:33 +0100 Subject: [PATCH 4/7] Update CONTRIBUTING with information about PG function labels --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 05e969e..e478427 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,12 @@ refactoring or bugfixing, a topic branch must be created out of the `develop`. Modifications are done inside `src/pg/sql` and `src/py/crankshaft`. +When adding a new PostgreSQL function or modifying an exiting one make sure that the +[VOLATILITY](https://www.postgresql.org/docs/current/static/xfunc-volatility.html) and [PARALLEL](https://www.postgresql.org/docs/9.6/static/parallel-safety.html) categories are updated accordingly. +As PARALLEL labels need to be stripped for incompatible PostgreSQL versions +please use _PARALLEL SAFE/RESTRICTED/UNSAFE_ in uppercase so it's handled +automatically. + Take into account: * Tests must be added for any new functionality From de0bbb0bd35fa562347fb97dd0ac313a3789fc9f Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Wed, 15 Nov 2017 11:08:29 +0100 Subject: [PATCH 5/7] Categorize GWR sql functions --- src/pg/sql/21_gwr.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pg/sql/21_gwr.sql b/src/pg/sql/21_gwr.sql index 92c2b93..2fcad7a 100644 --- a/src/pg/sql/21_gwr.sql +++ b/src/pg/sql/21_gwr.sql @@ -15,7 +15,7 @@ gwr = GWR() return gwr.gwr(subquery, dep_var, ind_vars, bw, fixed, kernel, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION @@ -33,4 +33,4 @@ gwr = GWR() return gwr.gwr_predict(subquery, dep_var, ind_vars, bw, fixed, kernel, geom_col, id_col) -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; From 192f89bf4d4eb0acb9522af46dce8a7d14dcd373 Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Wed, 15 Nov 2017 13:01:47 +0100 Subject: [PATCH 6/7] Makefile: Strip PARALLEL tags on deploy Since releases are commited into the proyect instead of stripping the labels when generating the release file, we need to do it before deploying (depending on the PG release) --- src/pg/Makefile | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/pg/Makefile b/src/pg/Makefile index 32f543b..0103c84 100644 --- a/src/pg/Makefile +++ b/src/pg/Makefile @@ -24,13 +24,12 @@ REPLACEMENTS = -e 's/@@VERSION@@/$(EXTVERSION)/g' $(DATA): $(SOURCES_DATA) $(SED) $(REPLACEMENTS) $(SOURCES_DATA_DIR)/*.sql > $@ ifeq ($(PG_PARALLEL), 0) -# Remove PARALLEL in aggregates and functions - $(eval TMPFILE := $(shell mktemp /tmp/$(basename $0).XXXXXXXX)) - $(SED) -e 's/PARALLEL \= [A-Z]*,/''/g' \ - -e 's/PARALLEL [A-Z]*/''/g' $@ > $(TMPFILE) + $(eval TMPFILE := $(shell mktemp /tmp/$@.XXXXXXXXXX)) + $(SED) -e 's/PARALLEL \= [A-Z]*,/''/g' -e 's/PARALLEL [A-Z]*/''/g' $@ > $(TMPFILE); mv $(TMPFILE) $@ endif + TEST_DIR = test REGRESS = $(sort $(notdir $(basename $(wildcard $(TEST_DIR)/sql/*test.sql)))) REGRESS_OPTS = --inputdir='$(TEST_DIR)' --outputdir='$(TEST_DIR)' @@ -57,7 +56,18 @@ test: installcheck release: ../../release/$(EXTENSION).control $(SOURCES_DATA) $(SED) $(REPLACEMENTS) $(SOURCES_DATA_DIR)/*.sql > ../../release/$(EXTENSION)--$(EXTVERSION).sql -# Install the current relese into the PostgreSQL extensions directory -deploy: +# If needed remove PARALLEL tags from the release files +release_remove_parallel_deploy: +ifeq ($(PG_PARALLEL), 0) + for n in $(wildcard ../../release/*.sql); do \ + $(eval TMPFILE := $(shell mktemp /tmp/XXXXXXXXXX)) \ + $(SED) -e 's/PARALLEL \= [A-Z]*,/''/g' -e 's/PARALLEL [A-Z]*/''/g' $$n > $(TMPFILE); \ + mv $(TMPFILE) $$n; \ + done +endif + +# Install the current release into the PostgreSQL extensions directory +deploy: release_remove_parallel_deploy $(INSTALL_DATA) ../../release/$(EXTENSION).control '$(DESTDIR)$(datadir)/extension/' $(INSTALL_DATA) ../../release/*.sql '$(DESTDIR)$(datadir)/extension/' + From 835f80b1b6745cc6f5ce98bcfe388d6a9f342389 Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Thu, 23 Nov 2017 09:38:07 +0100 Subject: [PATCH 7/7] Update RELEASE process --- RELEASE.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 3ed577a..44a9a2f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -4,33 +4,35 @@ The release process of a new version of the extension shall be performed by the designated *Release Manager*. ## Release steps -1. Make sure `develop` branch passes all the tests. -1. Merge `develop` into `master` -1. Update the version number in `src/pg/crankshaft.control`. -1. Generate the next release files with this command: +* Make sure `develop` branch passes all the tests. +* Merge `develop` into `master` +* Update the version number in `src/pg/crankshaft.control`. +* Generate the next release files with this command: ```shell make release ``` -1. Generate an upgrade path from the previous to the next release by copying the generated release file. E.g: +* Generate an upgrade path from the previous to the next release by copying the generated release file. E.g: ```shell cp release/crankshaft--X.Y.Z.sql release/crankshaft--A.B.C--X.Y.Z.sql ``` - NOTE: you can rely on this thanks to the compatibility checks. - + NOTE: you can rely on this thanks to the compatibility checks. TODO: automate this step [#94](https://github.com/CartoDB/crankshaft/issues/94) -2. Update the [NEWS.md](https://github.com/CartoDB/crankshaft/blob/master/NEWS.md) file -1. Commit and push the generated files. -1. Tag the release: + + * Update the [NEWS.md](https://github.com/CartoDB/crankshaft/blob/master/NEWS.md) file + * Commit and push the generated files. + * Tag the release: ``` git tag -a X.Y.Z -m "Release X.Y.Z" git push origin X.Y.Z ``` -1. Deploy and test in staging -1. Deploy and test in production -1. Merge back into develop + +* Deploy and test in staging +* Merge `master` into **`stable`** +* Deploy and test in production +* Merge `master` into **`develop`** ## Some remarks