about summary refs log tree commit diff
path: root/pkgs/servers/sql/postgresql
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers/sql/postgresql')
-rw-r--r--pkgs/servers/sql/postgresql/cstore_fdw/default.nix32
-rw-r--r--pkgs/servers/sql/postgresql/default.nix98
-rw-r--r--pkgs/servers/sql/postgresql/hardcode-pgxs-path-96.patch14
-rw-r--r--pkgs/servers/sql/postgresql/hardcode-pgxs-path.patch17
-rw-r--r--pkgs/servers/sql/postgresql/jdbc/default.nix28
-rw-r--r--pkgs/servers/sql/postgresql/less-is-more-96.patch12
-rw-r--r--pkgs/servers/sql/postgresql/pg_cron/default.nix31
-rw-r--r--pkgs/servers/sql/postgresql/pg_hll/default.nix31
-rw-r--r--pkgs/servers/sql/postgresql/pg_repack/default.nix35
-rw-r--r--pkgs/servers/sql/postgresql/pg_similarity/default.nix31
-rw-r--r--pkgs/servers/sql/postgresql/pgjwt/default.nix25
-rw-r--r--pkgs/servers/sql/postgresql/pgroonga/default.nix30
-rw-r--r--pkgs/servers/sql/postgresql/pgtap/default.nix32
-rw-r--r--pkgs/servers/sql/postgresql/plv8/default.nix34
-rw-r--r--pkgs/servers/sql/postgresql/psqlodbc/default.nix1
-rw-r--r--pkgs/servers/sql/postgresql/specify_pkglibdir_at_runtime.patch29
-rw-r--r--pkgs/servers/sql/postgresql/timescaledb/default.nix44
-rw-r--r--pkgs/servers/sql/postgresql/topn/default.nix32
-rw-r--r--pkgs/servers/sql/postgresql/tsearch_extras/default.nix29
19 files changed, 539 insertions, 46 deletions
diff --git a/pkgs/servers/sql/postgresql/cstore_fdw/default.nix b/pkgs/servers/sql/postgresql/cstore_fdw/default.nix
new file mode 100644
index 000000000000..70b8abf2502d
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/cstore_fdw/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchFromGitHub, postgresql, protobufc }:
+
+stdenv.mkDerivation rec {
+  name = "cstore_fdw-${version}";
+  version = "1.6.0";
+
+  nativeBuildInputs = [ protobufc ];
+  buildInputs = [ postgresql ];
+
+  src = fetchFromGitHub {
+    owner  = "citusdata";
+    repo   = "cstore_fdw";
+    rev    = "refs/tags/v${version}";
+    sha256 = "08jbx4hs2r742flilydp0ajjwv8ffnvq82nidh48irrfa4i7n0l0";
+  };
+
+  installPhase = ''
+    mkdir -p $out/{lib,share/extension}
+
+    cp *.so      $out/lib
+    cp *.sql     $out/share/extension
+    cp *.control $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Columnar storage for PostgreSQL";
+    homepage    = https://www.citusdata.com/;
+    maintainers = with maintainers; [ thoughtpolice ];
+    platforms   = platforms.linux;
+    license     = licenses.asl20;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/default.nix b/pkgs/servers/sql/postgresql/default.nix
index cf4519a82327..5d348c129437 100644
--- a/pkgs/servers/sql/postgresql/default.nix
+++ b/pkgs/servers/sql/postgresql/default.nix
@@ -1,8 +1,9 @@
-{ lib, stdenv, fetchurl, zlib, readline, libossp_uuid, openssl }:
+{ lib, stdenv, glibc, fetchurl, zlib, readline, libossp_uuid, openssl, libxml2, makeWrapper }:
 
 let
 
-  common = { version, sha256, psqlSchema } @ args: stdenv.mkDerivation (rec {
+  common = { version, sha256, psqlSchema } @ args:
+   let atLeast = lib.versionAtLeast version; in stdenv.mkDerivation (rec {
     name = "postgresql-${version}";
 
     src = fetchurl {
@@ -10,36 +11,72 @@ let
       inherit sha256;
     };
 
-    outputs = [ "out" "doc" ];
+    outputs = [ "out" "lib" "doc" "man" ];
+    setOutputFlags = false; # $out retains configureFlags :-/
 
     buildInputs =
-      [ zlib readline openssl ]
+      [ zlib readline openssl libxml2 makeWrapper ]
       ++ lib.optionals (!stdenv.isDarwin) [ libossp_uuid ];
 
     enableParallelBuilding = true;
 
     makeFlags = [ "world" ];
 
-    configureFlags =
-      [ "--with-openssl" ]
+    configureFlags = [
+      "--with-openssl"
+      "--with-libxml"
+      "--sysconfdir=/etc"
+      "--libdir=$(lib)/lib"
+    ]
       ++ lib.optional (stdenv.isDarwin)  "--with-uuid=e2fs"
       ++ lib.optional (!stdenv.isDarwin) "--with-ossp-uuid";
 
     patches =
-      [ (if lib.versionAtLeast version "9.4" then ./disable-resolve_symlinks-94.patch else ./disable-resolve_symlinks.patch)
-        ./less-is-more.patch
+      [ (if atLeast "9.4" then ./disable-resolve_symlinks-94.patch else ./disable-resolve_symlinks.patch)
+        (if atLeast "9.6" then ./less-is-more-96.patch             else ./less-is-more.patch)
+        (if atLeast "9.6" then ./hardcode-pgxs-path-96.patch       else ./hardcode-pgxs-path.patch)
+        ./specify_pkglibdir_at_runtime.patch
       ];
 
     installTargets = [ "install-world" ];
 
     LC_ALL = "C";
 
+    postConfigure =
+      let path = if atLeast "9.6" then "src/common/config_info.c" else "src/bin/pg_config/pg_config.c"; in
+        ''
+          # Hardcode the path to pgxs so pg_config returns the path in $out
+          substituteInPlace "${path}" --replace HARDCODED_PGXS_PATH $out/lib
+        '';
+
     postInstall =
       ''
+        moveToOutput "lib/pgxs" "$out" # looks strange, but not deleting it
+        moveToOutput "lib/*.a" "$out"
+        moveToOutput "lib/libecpg*" "$out"
+
         # Prevent a retained dependency on gcc-wrapper.
-        substituteInPlace $out/lib/pgxs/src/Makefile.global --replace ${stdenv.cc}/bin/ld ld
+        substituteInPlace "$out/lib/pgxs/src/Makefile.global" --replace ${stdenv.cc}/bin/ld ld
+
+        if [ -z "''${dontDisableStatic:-}" ]; then
+          # Remove static libraries in case dynamic are available.
+          for i in $out/lib/*.a; do
+            name="$(basename "$i")"
+            if [ -e "$lib/lib/''${name%.a}.so" ] || [ -e "''${i%.a}.so" ]; then
+              rm "$i"
+            fi
+          done
+        fi
       '';
 
+    postFixup = lib.optionalString (!stdenv.isDarwin && stdenv.hostPlatform.libc == "glibc")
+      ''
+        # initdb needs access to "locale" command from glibc.
+        wrapProgram $out/bin/initdb --prefix PATH ":" ${glibc.bin}/bin
+      '';
+
+    doInstallCheck = false; # needs a running daemon?
+
     disallowedReferences = [ stdenv.cc ];
 
     passthru = {
@@ -47,45 +84,44 @@ let
     };
 
     meta = with lib; {
-      homepage = http://www.postgresql.org/;
+      homepage = https://www.postgresql.org;
       description = "A powerful, open source object-relational database system";
       license = licenses.postgresql;
       maintainers = [ maintainers.ocharles ];
       platforms = platforms.unix;
-      hydraPlatforms = platforms.linux;
     };
   });
 
 in {
 
-  postgresql90 = common {
-    version = "9.0.22";
-    psqlSchema = "9.0";
-    sha256 = "19gq6axjhvlr5zlrzwnll1fbrvai4xh0nb1jki6gmmschl6v5m4l";
+  postgresql93 = common {
+    version = "9.3.22";
+    psqlSchema = "9.3";
+    sha256 = "06p9rk2bav41ybp8ra1bpf44avw9kl5s1wyql21n5awvlm5fs60v";
   };
 
-  postgresql91 = common {
-    version = "9.1.18";
-    psqlSchema = "9.1";
-    sha256 = "1a44hmcvfaa8j169ladsibmvjakw6maaxqkzz1ab8139cqkda9i7";
+  postgresql94 = common {
+    version = "9.4.17";
+    psqlSchema = "9.4";
+    sha256 = "1inpkwbr2xappz3kq3jr3hsn6mwn167nijcx406q8aq56p9hqcks";
   };
 
-  postgresql92 = common {
-    version = "9.2.13";
-    psqlSchema = "9.2";
-    sha256 = "0i3avdr8mnvn6ldkx0hc4jmclhisb2338hzs0j2m03wck8hddjsx";
+  postgresql95 = common {
+    version = "9.5.12";
+    psqlSchema = "9.5";
+    sha256 = "167nlrpsnqz63gafgn21j4yc2f5g1mpfkz8qxjxk2xs6crf6zs02";
   };
 
-  postgresql93 = common {
-    version = "9.3.9";
-    psqlSchema = "9.3";
-    sha256 = "0j85j69rf54cwz5yhrhk4ca22b82990j5sqb8cr1fl9843nd0fzp";
+  postgresql96 = common {
+    version = "9.6.8";
+    psqlSchema = "9.6";
+    sha256 = "0w7bwf19wbdd3jjbjv03cnx56qka4801srcbsayk9v792awv7zga";
   };
 
-  postgresql94 = common {
-    version = "9.4.4";
-    psqlSchema = "9.4";
-    sha256 = "04q07g209y99xzjh88y52qpvz225rxwifv8nzp3bxzfni2bdk3jk";
+  postgresql100 = common {
+    version = "10.3";
+    psqlSchema = "10.0";
+    sha256 = "06lkcwsf851z49zqcws5yc77s2yrbaazf2nvbk38hpp31rw6i8kf";
   };
 
 }
diff --git a/pkgs/servers/sql/postgresql/hardcode-pgxs-path-96.patch b/pkgs/servers/sql/postgresql/hardcode-pgxs-path-96.patch
new file mode 100644
index 000000000000..6cd449769baa
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/hardcode-pgxs-path-96.patch
@@ -0,0 +1,14 @@
+diff -Naur postgresql-9.6.1-orig/src/common/config_info.c postgresql-9.6.1/src/common/config_info.c
+--- postgresql-9.6.1-orig/src/common/config_info.c	2016-11-22 21:39:29.231929261 +0100
++++ postgresql-9.6.1/src/common/config_info.c	2016-11-22 23:36:53.685163543 +0100
+@@ -118,7 +118,10 @@
+ 	i++;
+
+ 	configdata[i].name = pstrdup("PGXS");
++	strlcpy(path, "HARDCODED_PGXS_PATH", sizeof(path));
++/* commented out to be able to point to nix $out path
+ 	get_pkglib_path(my_exec_path, path);
++*/
+ 	strlcat(path, "/pgxs/src/makefiles/pgxs.mk", sizeof(path));
+ 	cleanup_path(path);
+ 	configdata[i].setting = pstrdup(path);
diff --git a/pkgs/servers/sql/postgresql/hardcode-pgxs-path.patch b/pkgs/servers/sql/postgresql/hardcode-pgxs-path.patch
new file mode 100644
index 000000000000..355813ffe20e
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/hardcode-pgxs-path.patch
@@ -0,0 +1,17 @@
+--- a/src/bin/pg_config/pg_config.c
++++ b/src/bin/pg_config/pg_config.c
+@@ -220,11 +220,13 @@ show_sysconfdir(bool all)
+ static void
+ show_pgxs(bool all)
+ {
+-	char		path[MAXPGPATH];
++	char		path[MAXPGPATH] = "HARDCODED_PGXS_PATH";
+ 
+ 	if (all)
+ 		printf("PGXS = ");
++  /* commented out to be able to point to nix $out path
+ 	get_pkglib_path(mypath, path);
++  */
+ 	strlcat(path, "/pgxs/src/makefiles/pgxs.mk", sizeof(path));
+ 	cleanup_path(path);
+ 	printf("%s\n", path);
diff --git a/pkgs/servers/sql/postgresql/jdbc/default.nix b/pkgs/servers/sql/postgresql/jdbc/default.nix
index ba5a9ead698f..62ebf6b44533 100644
--- a/pkgs/servers/sql/postgresql/jdbc/default.nix
+++ b/pkgs/servers/sql/postgresql/jdbc/default.nix
@@ -1,28 +1,26 @@
-{ stdenv, fetchurl, ant, jdk }:
-
-let version = "9.3-1100"; in
+{ stdenv, fetchMavenArtifact }:
 
 stdenv.mkDerivation rec {
   name = "postgresql-jdbc-${version}";
+  version = "42.2.2";
 
-  src = fetchurl {
-    url = "http://jdbc.postgresql.org/download/postgresql-jdbc-${version}.src.tar.gz";
-    sha256 = "0mbdzhzg4ws0i7ps98rg0q5n68lsrdm2klj7y7skaix0rpa57gp6";
+  src = fetchMavenArtifact {
+    artifactId = "postgresql";
+    groupId = "org.postgresql";
+    sha256 = "0w7sfi1gmzqhyhr4iq9znv8hff41xwwqcblkyd9ph0m34r0555hr";
+    inherit version;
   };
 
-  buildInputs = [ ant jdk ];
-
-  buildPhase = "ant";
+  phases = [ "installPhase" ];
 
-  installPhase =
-    ''
-      mkdir -p $out/share/java
-      cp jars/*.jar $out/share/java
-    '';
+  installPhase = ''
+    install -D $src/share/java/*_postgresql-${version}.jar $out/share/java/postgresql-jdbc.jar
+  '';
 
   meta = with stdenv.lib; {
-    homepage = http://jdbc.postgresql.org/;
+    homepage = https://jdbc.postgresql.org/;
     description = "JDBC driver for PostgreSQL allowing Java programs to connect to a PostgreSQL database";
     license = licenses.bsd3;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/servers/sql/postgresql/less-is-more-96.patch b/pkgs/servers/sql/postgresql/less-is-more-96.patch
new file mode 100644
index 000000000000..f14af9dc2207
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/less-is-more-96.patch
@@ -0,0 +1,12 @@
+diff -Naur postgresql-9.6.1-orig/src/include/fe_utils/print.h postgresql-9.6.1/src/include/fe_utils/print.h
+--- postgresql-9.6.1-orig/src/include/fe_utils/print.h	2016-11-22 21:39:29.148932827 +0100
++++ postgresql-9.6.1/src/include/fe_utils/print.h	2016-11-22 21:39:36.283626258 +0100
+@@ -18,7 +18,7 @@
+ 
+ /* This is not a particularly great place for this ... */
+ #ifndef __CYGWIN__
+-#define DEFAULT_PAGER "more"
++#define DEFAULT_PAGER "less"
+ #else
+ #define DEFAULT_PAGER "less"
+ #endif
diff --git a/pkgs/servers/sql/postgresql/pg_cron/default.nix b/pkgs/servers/sql/postgresql/pg_cron/default.nix
new file mode 100644
index 000000000000..c5a7a40546ef
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pg_cron/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchFromGitHub, postgresql }:
+
+stdenv.mkDerivation rec {
+  name = "pg_cron-${version}";
+  version = "1.0.2";
+
+  buildInputs = [ postgresql ];
+
+  src = fetchFromGitHub {
+    owner  = "citusdata";
+    repo   = "pg_cron";
+    rev    = "refs/tags/v${version}";
+    sha256 = "0z743bbal9j0pvqskznfj0zvjsqvdl7p90d4fdrl0sc0crc3nvyx";
+  };
+
+  installPhase = ''
+    mkdir -p $out/{lib,share/extension}
+
+    cp *.so      $out/lib
+    cp *.sql     $out/share/extension
+    cp *.control $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Run Cron jobs through PostgreSQL";
+    homepage    = https://www.citusdata.com/;
+    maintainers = with maintainers; [ thoughtpolice ];
+    platforms   = platforms.linux;
+    license     = licenses.postgresql;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/pg_hll/default.nix b/pkgs/servers/sql/postgresql/pg_hll/default.nix
new file mode 100644
index 000000000000..6c453f6a40c3
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pg_hll/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, fetchFromGitHub, postgresql }:
+
+stdenv.mkDerivation rec {
+  name = "pg_hll-${version}";
+  version = "2.10.2-${builtins.substring 0 7 src.rev}";
+
+  buildInputs = [ postgresql ];
+
+  src = fetchFromGitHub {
+    owner  = "citusdata";
+    repo   = "postgresql-hll";
+    rev    = "9af41684d479a3097bab87d04936702c9e6baf5c";
+    sha256 = "044x9v9kjhxb0idqb9f5i7c3yygxxsqliswl4kspqy9f9qcblckl";
+  };
+
+  installPhase = ''
+    mkdir -p $out/{lib,share/extension}
+
+    cp *.so      $out/lib
+    cp *.sql     $out/share/extension
+    cp *.control $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "HyperLogLog for PostgreSQL";
+    homepage    = https://www.citusdata.com/;
+    maintainers = with maintainers; [ thoughtpolice ];
+    platforms   = platforms.linux;
+    license     = licenses.asl20;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/pg_repack/default.nix b/pkgs/servers/sql/postgresql/pg_repack/default.nix
new file mode 100644
index 000000000000..1b7cd08b082b
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pg_repack/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchFromGitHub, postgresql, openssl, zlib, readline }:
+
+stdenv.mkDerivation rec {
+    name = "pg_repack-${version}";
+    version = "1.4.3";
+
+    buildInputs = [ postgresql openssl zlib readline ];
+
+    src = fetchFromGitHub {
+      owner  = "reorg";
+      repo   = "pg_repack";
+      rev    = "refs/tags/ver_${version}";
+      sha256 = "1mmd22nfaxjwnbl3i95f3ivmjvfqwdflgaczlg3129dbpwg265xr";
+    };
+
+    installPhase = ''
+      install -D bin/pg_repack -t $out/bin/
+      install -D lib/pg_repack.so -t $out/lib/
+      install -D lib/{pg_repack--${version}.sql,pg_repack.control} -t $out/share/extension
+    '';
+
+    meta = with stdenv.lib; {
+      description = "Reorganize tables in PostgreSQL databases with minimal locks";
+      longDescription = ''
+        pg_repack is a PostgreSQL extension which lets you remove bloat from tables and indexes, and optionally restore
+        the physical order of clustered indexes. Unlike CLUSTER and VACUUM FULL it works online, without holding an
+        exclusive lock on the processed tables during processing. pg_repack is efficient to boot,
+        with performance comparable to using CLUSTER directly.
+      '';
+      license = licenses.bsd3;
+      maintainers = with maintainers; [ danbst ];
+      inherit (postgresql.meta) platforms;
+      inherit (src.meta) homepage;
+    };
+}
diff --git a/pkgs/servers/sql/postgresql/pg_similarity/default.nix b/pkgs/servers/sql/postgresql/pg_similarity/default.nix
new file mode 100644
index 000000000000..32945c9fa62b
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pg_similarity/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, fetchFromGitHub, gcc, postgresql }:
+
+stdenv.mkDerivation {
+
+  name = "pg_similarity-1.0";
+  src = fetchFromGitHub {
+    owner = "eulerto";
+    repo = "pg_similarity";
+    rev = "be1a8b08c8716e59b89982557da9ea68cdf868c5";
+    sha256 = "1z4v4r2yccdr8kz3935fnk1bc5vj0qj0apscldyap4wxlyi89xim";
+  };
+
+  buildInputs = [ postgresql gcc ];
+  buildPhase = "USE_PGXS=1 make";
+  installPhase = ''
+    mkdir -p $out/bin   # for buildEnv to setup proper symlinks
+    install -D pg_similarity.so -t $out/lib/
+    install -D ./{pg_similarity--unpackaged--1.0.sql,pg_similarity--1.0.sql,pg_similarity.control} -t $out/share/extension
+  '';
+
+  meta = {
+    description = ''
+       pg_similarity is an extension to support similarity queries on PostgreSQL. The implementation
+       is tightly integrated in the RDBMS in the sense that it defines operators so instead of the traditional
+       operators (= and <>) you can use ~~~ and ~!~ (any of these operators represents a similarity function).
+    '';
+    platforms = stdenv.lib.platforms.linux;
+    license = stdenv.lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ danbst ];
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/pgjwt/default.nix b/pkgs/servers/sql/postgresql/pgjwt/default.nix
new file mode 100644
index 000000000000..3e01d9bfe2ca
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pgjwt/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation rec {
+  name = "pgjwt-${version}";
+  version = "unstable-2017-04-24";
+  src = fetchFromGitHub {
+    owner = "michelp";
+    repo = "pgjwt";
+    rev = "546a2911027b716586e241be7fd4c6f1785237cd";
+    sha256 = "1riz0xvwb6y02j0fljbr9hcbqb2jqs4njlivmavy9ysbcrrv1vrf";
+  };
+  dontBuild = true;
+  installPhase = ''
+    mkdir -p $out/bin  # current postgresql extension mechanism in nixos requires bin directory
+    mkdir -p $out/share/extension
+    cp pg*sql *.control $out/share/extension
+  '';
+  meta = with stdenv.lib; {
+    description = "PostgreSQL implementation of JSON Web Tokens";
+    longDescription = ''
+      sign() and verify() functions to create and verify JSON Web Tokens.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [spinus];
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/pgroonga/default.nix b/pkgs/servers/sql/postgresql/pgroonga/default.nix
new file mode 100644
index 000000000000..6dcd19d8d680
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pgroonga/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, fetchurl, pkgconfig, postgresql, libmsgpack, groonga }:
+
+stdenv.mkDerivation rec {
+  name = "pgroonga-${version}";
+  version = "2.0.6";
+
+  src = fetchurl {
+    url = "http://packages.groonga.org/source/pgroonga/${name}.tar.gz";
+    sha256 = "1hfmz3d0xwhsa4vw8i08s15i7pfd0h0smi2rv663x3cjjjn40i68";
+  };
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ postgresql libmsgpack groonga ];
+
+  makeFlags = [ "HAVE_MSGPACK=1" ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -D pgroonga.so -t $out/lib/
+    install -D ./{pgroonga-*.sql,pgroonga.control} -t $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A PostgreSQL extension to use Groonga as the index";
+    longDescription = "PGroonga is a PostgreSQL extension to use Groonga as the index. PostgreSQL supports full text search against languages that use only alphabet and digit. It means that PostgreSQL doesn't support full text search against Japanese, Chinese and so on. You can use super fast full text search feature against all languages by installing PGroonga into your PostgreSQL.";
+    homepage = https://pgroonga.github.io/;
+    license = licenses.postgresql;
+    maintainers = with maintainers; [ DerTim1 ];
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/pgtap/default.nix b/pkgs/servers/sql/postgresql/pgtap/default.nix
new file mode 100644
index 000000000000..1206e50926ed
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/pgtap/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchFromGitHub, postgresql, perl, perlPackages, which }:
+
+stdenv.mkDerivation rec {
+  name = "pgtap-${version}";
+  version = "0.98.0";
+
+  src = fetchFromGitHub {
+    owner = "theory";
+    repo = "pgtap";
+    rev = "v${version}";
+    sha256 = "17r3b409k05pbypmwdwgm1fl669jc6a1391szyxizx784k44a369";
+  };
+
+  nativeBuildInputs = [ postgresql perl perlPackages.TAPParserSourceHandlerpgTAP which ];
+
+  installPhase = ''
+    install -D {sql/pgtap--${version}.sql,pgtap.control} -t $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "pgTAP is a unit testing framework for PostgreSQL";
+    longDescription = ''
+      pgTAP is a unit testing framework for PostgreSQL written in PL/pgSQL and PL/SQL.
+      It includes a comprehensive collection of TAP-emitting assertion functions,
+      as well as the ability to integrate with other TAP-emitting test frameworks.
+      It can also be used in the xUnit testing style.
+    '';
+    maintainers = with maintainers; [ willibutz ];
+    homepage = http://pgtap.org;
+    inherit (postgresql.meta) platforms;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/plv8/default.nix b/pkgs/servers/sql/postgresql/plv8/default.nix
new file mode 100644
index 000000000000..009f65b9d81c
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/plv8/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchFromGitHub, v8, perl, postgresql }:
+
+stdenv.mkDerivation rec {
+  name = "plv8-${version}";
+  version = "2.1.0";
+
+  nativeBuildInputs = [ perl ];
+  buildInputs = [ v8 postgresql ];
+
+  src = fetchFromGitHub {
+    owner = "plv8";
+    repo = "plv8";
+    rev = "v${version}";
+    sha256 = "1sfpxz0zcbinn6822j12lkwgrw9kfacrs83ic968rm489rl9w241";
+  };
+
+  preConfigure = ''
+    substituteInPlace Makefile --replace '-lv8_libplatform' '-lv8_libplatform -lv8_libbase'
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -D plv8.so                                         -t $out/lib
+    install -D {plls,plcoffee,plv8}{--${version}.sql,.control} -t $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "PL/v8 - A Procedural Language in JavaScript powered by V8";
+    homepage = https://pgxn.org/dist/plv8/;
+    maintainers = with maintainers; [ volth ];
+    platforms = platforms.linux;
+    license = licenses.postgresql;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/psqlodbc/default.nix b/pkgs/servers/sql/postgresql/psqlodbc/default.nix
index 72221c0eec01..111b1be80f81 100644
--- a/pkgs/servers/sql/postgresql/psqlodbc/default.nix
+++ b/pkgs/servers/sql/postgresql/psqlodbc/default.nix
@@ -16,5 +16,6 @@ stdenv.mkDerivation rec {
     homepage = http://psqlodbc.projects.postgresql.org/;
     description = "ODBC driver for PostgreSQL";
     license = licenses.lgpl2;
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/servers/sql/postgresql/specify_pkglibdir_at_runtime.patch b/pkgs/servers/sql/postgresql/specify_pkglibdir_at_runtime.patch
new file mode 100644
index 000000000000..fe95d2ee99f0
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/specify_pkglibdir_at_runtime.patch
@@ -0,0 +1,29 @@
+diff -ur postgresql-9.5.3-orig/src/port/path.c postgresql-9.5.3/src/port/path.c
+--- postgresql-9.5.3-orig/src/port/path.c	2016-05-09 22:50:23.000000000 +0200
++++ postgresql-9.5.3/src/port/path.c	2016-08-29 22:44:10.507377613 +0200
+@@ -714,7 +714,11 @@
+ void
+ get_lib_path(const char *my_exec_path, char *ret_path)
+ {
+-	make_relative_path(ret_path, LIBDIR, PGBINDIR, my_exec_path);
++	char const * const nix_pglibdir = getenv("NIX_PGLIBDIR");
++	if(nix_pglibdir == NULL)
++		make_relative_path(ret_path, LIBDIR, PGBINDIR, my_exec_path);
++	else
++		make_relative_path(ret_path, nix_pglibdir, PGBINDIR, my_exec_path);
+ }
+ 
+ /*
+@@ -723,7 +727,11 @@
+ void
+ get_pkglib_path(const char *my_exec_path, char *ret_path)
+ {
+-	make_relative_path(ret_path, PKGLIBDIR, PGBINDIR, my_exec_path);
++	char const * const nix_pglibdir = getenv("NIX_PGLIBDIR");
++	if(nix_pglibdir == NULL)
++		make_relative_path(ret_path, PKGLIBDIR, PGBINDIR, my_exec_path);
++	else
++		make_relative_path(ret_path, nix_pglibdir, PGBINDIR, my_exec_path);
+ }
+ 
+ /*
diff --git a/pkgs/servers/sql/postgresql/timescaledb/default.nix b/pkgs/servers/sql/postgresql/timescaledb/default.nix
new file mode 100644
index 000000000000..ce298cb2745d
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/timescaledb/default.nix
@@ -0,0 +1,44 @@
+{ stdenv, fetchFromGitHub, cmake, postgresql }:
+
+# # To enable on NixOS:
+# config.services.postgresql = {
+#   extraPlugins = [ pkgs.timescaledb ];
+#   extraConfig = "shared_preload_libraries = 'timescaledb'";
+# }
+
+stdenv.mkDerivation rec {
+  name = "timescaledb-${version}";
+  version = "0.9.2";
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ postgresql ];
+
+  src = fetchFromGitHub {
+    owner  = "timescale";
+    repo   = "timescaledb";
+    rev    = "refs/tags/${version}";
+    sha256 = "1zgyd407skqbsw2zj3l9hixwlisnj82yb6hbq5khjg9k0ifvvgyp";
+  };
+
+  # Fix the install phase which tries to install into the pgsql extension dir,
+  # and cannot be manually overridden. This is rather fragile but works OK.
+  patchPhase = ''
+    for x in CMakeLists.txt sql/CMakeLists.txt; do
+      substituteInPlace "$x" \
+        --replace 'DESTINATION "''${PG_SHAREDIR}/extension"' "DESTINATION \"$out/share/extension\""
+    done
+
+    for x in src/CMakeLists.txt src/loader/CMakeLists.txt; do
+      substituteInPlace "$x" \
+        --replace 'DESTINATION ''${PG_PKGLIBDIR}' "DESTINATION \"$out/lib\""
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Scales PostgreSQL for time-series data via automatic partitioning across time and space";
+    homepage    = https://www.timescale.com/;
+    maintainers = with maintainers; [ volth ];
+    platforms   = platforms.linux;
+    license     = licenses.postgresql;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/topn/default.nix b/pkgs/servers/sql/postgresql/topn/default.nix
new file mode 100644
index 000000000000..6886c80cf50d
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/topn/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchFromGitHub, postgresql, protobufc }:
+
+stdenv.mkDerivation rec {
+  name = "pg_topn-${version}";
+  version = "2.0.2";
+
+  nativeBuildInputs = [ protobufc ];
+  buildInputs = [ postgresql ];
+
+  src = fetchFromGitHub {
+    owner  = "citusdata";
+    repo   = "postgresql-topn";
+    rev    = "refs/tags/v${version}";
+    sha256 = "00hc3hgnqv9xaalizbcvprb7s55sydj2qgk3rhgrdlwg2g025h62";
+  };
+
+  installPhase = ''
+    mkdir -p $out/{lib,share/extension}
+
+    cp *.so      $out/lib
+    cp *.sql     $out/share/extension
+    cp *.control $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Efficient querying of 'top values' for PostgreSQL";
+    homepage    = https://www.citusdata.com/;
+    maintainers = with maintainers; [ thoughtpolice ];
+    platforms   = platforms.linux;
+    license     = licenses.agpl3;
+  };
+}
diff --git a/pkgs/servers/sql/postgresql/tsearch_extras/default.nix b/pkgs/servers/sql/postgresql/tsearch_extras/default.nix
new file mode 100644
index 000000000000..5140ae1a228f
--- /dev/null
+++ b/pkgs/servers/sql/postgresql/tsearch_extras/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchFromGitHub, pkgconfig, postgresql }:
+
+stdenv.mkDerivation rec {
+  name = "tsearch-extras-${version}";
+  version = "0.3";
+
+  src = fetchFromGitHub {
+    owner = "zulip";
+    repo = "tsearch_extras";
+    rev = version;
+    sha256 = "0i3i99lw80jwd4xflgdqabxmn1dnm1gm7dzf1mqv2drllxcy3yix";
+  };
+
+  nativenativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ postgresql ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    install -D tsearch_extras.so -t $out/lib/
+    install -D ./{tsearch_extras--1.0.sql,tsearch_extras.control} -t $out/share/extension
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Provides a few PostgreSQL functions for a lower-level data full text search";
+    homepage = https://github.com/zulip/tsearch_extras/;
+    license = licenses.postgresql;
+    maintainers = with maintainers; [ DerTim1 ];
+  };
+}