From 2a0b0e9f934573d5f61cedb6445202f242038bfa Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 12 Mar 2016 11:17:29 +0100 Subject: [PATCH] Fix heuristic rule for PLpgSQL --- lib/linguist/heuristics.rb | 2 +- samples/PLpgSQL/procedures.sql | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 samples/PLpgSQL/procedures.sql diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 666397d8..cbbcd03a 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -354,7 +354,7 @@ module Linguist end disambiguate ".sql" do |data| - if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) + if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) #Postgres Language["PLpgSQL"] elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data) diff --git a/samples/PLpgSQL/procedures.sql b/samples/PLpgSQL/procedures.sql new file mode 100644 index 00000000..51b6bc94 --- /dev/null +++ b/samples/PLpgSQL/procedures.sql @@ -0,0 +1,31 @@ +load 'plpgsql'; +load 'plpgsql_lint'; + +DROP FUNCTION IF EXISTS list_sites(); +CREATE OR REPLACE FUNCTION list_sites() RETURNS TABLE (fc json) AS +$func$ +BEGIN +RETURN QUERY SELECT row_to_json(feat_col) FROM ( + SELECT 'FeatureCollection' AS type, array_to_json(array_agg(feat)) AS features FROM ( + SELECT DISTINCT ON (new_id) 'Feature' AS type, ST_ASGeoJSON(loc.geom)::json AS geometry, row_to_json( + (SELECT prop FROM (SELECT new_id) AS prop)) AS properties FROM location loc) AS feat) AS feat_col; +END; +$func$ LANGUAGE plpgsql; + + +DROP FUNCTION IF EXISTS get_observations(character varying, integer); +CREATE OR REPLACE FUNCTION get_observations(kind varchar, site_id integer) RETURNS TABLE (fc json) AS +$func$ +BEGIN + IF kind = 'o2_abs' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, o2_abs AS value FROM oxygen WHERE new_id = site_id) AS obs; + ELSIF kind = 'o2_rel' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, o2_rel AS value FROM oxygen WHERE new_id = site_id) AS obs; + ELSIF kind = 'temp' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, temp AS value FROM oxygen WHERE new_id = site_id) AS obs; + END IF; +END; +$func$ LANGUAGE plpgsql;