SlideShare a Scribd company logo
Admin         How To




Installing
and Using
PostgreSQL
Modules
In this article, we will learn how to install and use the PostgreSQL modules chkpass,
fuzzystrmatch, isn and hstore. Modules add different capabilities to a database, like
admin and monitoring tools, new data types, operators, functions and algorithms.
Let’s look at modules that add new data types and algorithms, which will help us to
push some of the application logic to the database.



P
        ostgreSQL has been called the ‘most advanced open           su postgres
        source database’. I have been using it for the last four    createdb module_test
        years as an RDBMS for Foodlets.in, and as a spatial
data store at CSTEP (Center for Study of Science, Technology            Apply the chkpass, fuzzystrmatch, isn and hstore modules
and Policy). PostgreSQL is one piece of software that doesn’t       to the module_test database by running the following
fail to impress me every now and then.                              commands:

Installing the modules                                              psql -d module_test -f chkpass.sql
                                                                    psql -d module_test -f fuzzystrmatch.sql
        Note: I am running Ubuntu 10.04 and PostgreSQL 8.4.         psql -d module_test -f isn.sql
                                                                    psql -d module_test -f hstore.sql
    Install the postgresql-contrib package and restart the
database server, then check the contrib directory for the list of     Let us now look at an example of how each of the
available modules:                                                  modules is used.

sudo apt-get install postgresql-contrib                             Using chkpass
sudo /etc/init.d/postgresql-8.4 restart                             The chkpass module will introduce a new data type,
cd /usr/share/postgresql/8.4/contrib/                               ‘chkpass’, in the database. This type is used to store an
ls                                                                  encrypted field, e.g., a password. Let’s see how chkpass
                                                                    works for a user account table that we create and insert
     Create a test database called module_test:                     two rows into:


88  |  March 2012  | LINUX For You  |  www.LinuxForU.com
How To         Admin

CREATE TABLE accounts (username varchar(100), password         Using isn
chkpass);                                                      This module will introduce data types to store
INSERT INTO accounts(username, “password”) VALUES (‘user1’,    international standard numbers like International Standard
‘pass1’);                                                      Book Numbers (ISBN), International Standard Music
INSERT INTO accounts(username, “password”) VALUES (‘user2’,    Numbers (ISMN), International Standard Serial Numbers
‘pass2’);                                                      (ISSN), Universal Product Codes (UPC), etc. It will also
                                                               add functions to validate data, type-cast numbers from
    We can authenticate users with a query like the one        older formats to the newer 13-digit formats, and vice-
that follows:                                                  versa. Let’s test this module for storing book information:

SELECT count(*) from accounts where username=’user1’ and       CREATE TABLE books(number isbn13, title varchar(100))
password = ‘pass1’                                             INSERT INTO books(“number”, title) VALUES (‘978-03’,
                                                               ‘Rework’);
    The ‘=’ operator uses the eq(column_name, text) in
the module to test for equality. Chkpass uses the Unix            The INSERT statement throws an error: Invalid
crypt() function, and hence it is weak; only the first eight   input syntax for ISBN number: “978-03”. However, this
characters of the text are used in the algorithm. Chkpass      works just fine:
has limited practical use; the pgcrypto module is an
effective alternative.                                         INSERT INTO books(“number”, title) VALUES (‘978-0307463746’,
                                                               ‘Rework’)
Using fuzzystrmatch
This module installs the soundx(), difference(),                   To convert a 10-digit ISBN to 13 digits, use the
levenshtein() and metaphone() functions. Soundx() and          isbn13() function:
metaphone() are phonetic algorithms—they convert a
text string to a code string based on its pronunciation.       INSERT INTO books(“number”, title) VALUES
Difference() and levenshtein() return a numeric value          (isbn13(‘0307463745’), ‘Rework’)
based on the similarity of the two input strings. Let’s
now look into the levenshtein() and metaphone()                     (Actually, the name of the book mentioned here,
functions. The Levenshtein distance between two                'Rework' by Jason Fried, happens to be my favourite
strings is the minimum number of insertions, deletions         book on product/project management! I have prescribed
or substitutions required to convert one string to             it to all my team-mates.)
another.
                                                               Using hstore
SELECT levenshtein(‘foodlets’, ‘booklets’);                    You must have heard enough about NoSQL and key-
                                                               value databases. It’s not always NoSQL vs relational
    This query returns 2, as is obvious.                       databases—with the hstore module, PostgreSQL
    The metaphone() function takes a text string and           allows you to store data in the form of key-value pairs,
the maximum length of the output code as its two input         within a column of a table. Imagine you are processing
parameters. These examples return FTLTS:                       spreadsheets and you have no idea about the column
                                                               headers and the data type of the data in the sheets.
SELECT metaphone(‘foodlets’, 6);                               That’s when hstore comes to your rescue! Incidentally,
SELECT metaphone(‘fudlets’, 6);                                hstore takes keys and values as text; the value can
                                                               be NULL, but not the key. Let’s create a table with a
    If we try to get the Levenshtein distance between the      column of type hstore and insert some rows:
returned strings, this returns 0:
                                                               CREATE TABLE kv_data( id integer, data hstore)
SELECT levenshtein(‘FTLTS’,’FTLTS’);                           INSERT into kv_data values
                                                               (1, hstore(‘name’, ‘amit’) || hstore(‘city’, ‘bangalore’)),
    This means that the two words sound similar.               (2, hstore(‘name’, ‘raghu’) || hstore(‘age’, ‘26’)),
    Fuzzystrmatch is very helpful in implementing the          (3, hstore(‘name’, ‘ram’) || hstore(‘age’, ‘28’));
search feature for a website. Now the search can work with
alternate spellings and misspelled keywords. Reminds you           You can create your own keys like ‘height’,
of the ‘Did you mean...’ feature on Google Search, right?      ‘favourite_book,’ etc. The ‘||’ operator is used for


                                                                            www.LinuxForU.com  | LINUX For You  |  March 2012  |  89
Admin         How To
                                                           concatenation. Now that we have a table and a few
                                                           rows of data, let’s look at some SELECT, UPDATE and
                                                           DELETE queries. To select rows with the value for ‘city’ as
                                                           ‘bangalore’, use the following query:

                                                           SELECT * from kv_data where data->’city’ = ‘bangalore’


                                                               To get the average age across the table (returns 27.0), use
                                                           the query given below:

                                                           SELECT avg((data->’age’)::integer) age from kv_data;


                                                               Here, ::integer is used to type-cast the text value to an
                                                           integer, so that math operations can be performed on it.

                                                               To select and sort rows by ‘name’ values, use:

                                                           SELECT * from kv_data order by data->’name’ desc


                                                               Update the ‘city’ value to ‘delhi’ for all rows, as follows:

                                                           UPDATE kv_data SET data = data || (‘city’ => ‘delhi’);


                                                              Then, delete the ‘age’ key (and values) from all rows, as
                                                           shown below:

                                                           UPDATE kv_data set data = delete(data, ‘age’)


                                                               Next, delete rows with the ‘name’ as ‘amit’:

                                                           DELETE from kv_data where data->’name’ = ‘amit’


                                                              Although not a full-fledged key-value storage, hstore does
                                                           provide us with the flexibility of a key-value database and the
                                                           power of SQL queries.

                                                           Other useful modules
                                                           Here are some other modules you may find useful:
                                                              •	 Pgcrypto provides functions for hashing and
                                                                  encryption. It supports SHA, MD5, Blowfish, AES
                                                                  and other algorithms.
                                                              •	 Citext adds a case-insensitive text data type, which
                                                                  stores text in lower-case form.
                                                              •	 Uuid-ossp provides functions to generate universally
                                                                  unique identifiers.
                                                              •	 Pg_trgm adds functions to find text similarity based
                                                                  on trigram matching.


                                                             By: Sagar Arlekar
                                                             The author is a research engineer at CSTEP, Bengaluru. He
                                                             works in the domains of GIS and agent-based simulations. He
                                                             co-founded Foodlets.in, a visual food guide built entirely on
                                                             open source technologies.



90  |  March 2012  | LINUX For You  |  www.LinuxForU.com

More Related Content

PPTX
Cassandra
PDF
Indexing and Query Optimizer
PPT
Mysql Ppt
PPT
Lecture 04
PPT
mysqlHiep.ppt
PPTX
Learn PHP Lacture2
PDF
Python dictionary : past, present, future
Cassandra
Indexing and Query Optimizer
Mysql Ppt
Lecture 04
mysqlHiep.ppt
Learn PHP Lacture2
Python dictionary : past, present, future

What's hot (20)

PDF
PPTX
The Tools for Data Migration Between Oracle , MySQL and Flat Text File.
PPTX
Python data structures
PPT
PDF
learn you some erlang - chap 9 to chap10
PDF
Indexing and Query Optimizer (Richard Kreuter)
PDF
집단지성 프로그래밍 08-가격모델링
PPTX
Python 표준 라이브러리
PPT
MySql slides (ppt)
PDF
Mongoseattle indexing-2010-07-27
PDF
Stata Cheat Sheets (all)
PPTX
Sql analytic queries tips
PDF
Powerful Explain in MySQL 5.6
ODP
Python Day1
PDF
Functional es6
PDF
Developing Applications with MySQL and Java for beginners
PPTX
Indexing and Query Optimization
PPTX
Reducing Development Time with MongoDB vs. SQL
The Tools for Data Migration Between Oracle , MySQL and Flat Text File.
Python data structures
learn you some erlang - chap 9 to chap10
Indexing and Query Optimizer (Richard Kreuter)
집단지성 프로그래밍 08-가격모델링
Python 표준 라이브러리
MySql slides (ppt)
Mongoseattle indexing-2010-07-27
Stata Cheat Sheets (all)
Sql analytic queries tips
Powerful Explain in MySQL 5.6
Python Day1
Functional es6
Developing Applications with MySQL and Java for beginners
Indexing and Query Optimization
Reducing Development Time with MongoDB vs. SQL
Ad

Similar to PostgreSQL Modules Tutorial - chkpass, hstore, fuzzystrmach, isn (20)

PPT
ch3.ppt
PDF
PPT
ch3.ppt
PPT
ch3.ppt
PPT
Introduction to SQL
PPT
ch3.ppt
PPTX
ch3.pptx SQL in DBMS all Chapter with details
PPTX
Interface Python with MySQLwedgvwewefwefwe.pptx
PPT
The SQL data-definition language (DDL) allows the specification of informatio...
PPT
SQL manages and queries database data.ppt
PPT
ER model and diagram in database system
PPTX
Aggregate.pptx
PPTX
Python-for-Data-Analysis.pptx
PPT
Data Structure In C#
DOCX
INFORMATIVE ESSAYThe purpose of the Informative Essay assignme.docx
DOCX
DOCX
Data Manipulation with Numpy and Pandas in PythonStarting with N
PPTX
Getting started with ES6
PPTX
Interface Python with MySQL connectivity.pptx
ch3.ppt
ch3.ppt
ch3.ppt
Introduction to SQL
ch3.ppt
ch3.pptx SQL in DBMS all Chapter with details
Interface Python with MySQLwedgvwewefwefwe.pptx
The SQL data-definition language (DDL) allows the specification of informatio...
SQL manages and queries database data.ppt
ER model and diagram in database system
Aggregate.pptx
Python-for-Data-Analysis.pptx
Data Structure In C#
INFORMATIVE ESSAYThe purpose of the Informative Essay assignme.docx
Data Manipulation with Numpy and Pandas in PythonStarting with N
Getting started with ES6
Interface Python with MySQL connectivity.pptx
Ad

More from Sagar Arlekar (8)

PDF
Map Making with QGIS - Part II
PDF
Map Making with QGIS
PDF
Foodlets in Business Goa Magazine
PDF
The Foodlets Business Plan Released
PDF
Rails Plugins - Linux For You, March 2011 Issue
PDF
Foodlets Team Interview - Navhind Times
PDF
Getting Started - Creating products and services that make life better
PDF
Getting Started - Going out and creating a change
Map Making with QGIS - Part II
Map Making with QGIS
Foodlets in Business Goa Magazine
The Foodlets Business Plan Released
Rails Plugins - Linux For You, March 2011 Issue
Foodlets Team Interview - Navhind Times
Getting Started - Creating products and services that make life better
Getting Started - Going out and creating a change

Recently uploaded (20)

PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Encapsulation theory and applications.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Cloud computing and distributed systems.
PDF
Electronic commerce courselecture one. Pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
A Presentation on Artificial Intelligence
Mobile App Security Testing_ A Comprehensive Guide.pdf
Network Security Unit 5.pdf for BCA BBA.
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Reach Out and Touch Someone: Haptics and Empathic Computing
The Rise and Fall of 3GPP – Time for a Sabbatical?
Review of recent advances in non-invasive hemoglobin estimation
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Encapsulation theory and applications.pdf
Modernizing your data center with Dell and AMD
Diabetes mellitus diagnosis method based random forest with bat algorithm
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Dropbox Q2 2025 Financial Results & Investor Presentation
MYSQL Presentation for SQL database connectivity
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
20250228 LYD VKU AI Blended-Learning.pptx
Cloud computing and distributed systems.
Electronic commerce courselecture one. Pdf
Empathic Computing: Creating Shared Understanding
Per capita expenditure prediction using model stacking based on satellite ima...
A Presentation on Artificial Intelligence

PostgreSQL Modules Tutorial - chkpass, hstore, fuzzystrmach, isn

  • 1. Admin How To Installing and Using PostgreSQL Modules In this article, we will learn how to install and use the PostgreSQL modules chkpass, fuzzystrmatch, isn and hstore. Modules add different capabilities to a database, like admin and monitoring tools, new data types, operators, functions and algorithms. Let’s look at modules that add new data types and algorithms, which will help us to push some of the application logic to the database. P ostgreSQL has been called the ‘most advanced open su postgres source database’. I have been using it for the last four createdb module_test years as an RDBMS for Foodlets.in, and as a spatial data store at CSTEP (Center for Study of Science, Technology Apply the chkpass, fuzzystrmatch, isn and hstore modules and Policy). PostgreSQL is one piece of software that doesn’t to the module_test database by running the following fail to impress me every now and then. commands: Installing the modules psql -d module_test -f chkpass.sql psql -d module_test -f fuzzystrmatch.sql Note: I am running Ubuntu 10.04 and PostgreSQL 8.4. psql -d module_test -f isn.sql psql -d module_test -f hstore.sql Install the postgresql-contrib package and restart the database server, then check the contrib directory for the list of Let us now look at an example of how each of the available modules: modules is used. sudo apt-get install postgresql-contrib Using chkpass sudo /etc/init.d/postgresql-8.4 restart The chkpass module will introduce a new data type, cd /usr/share/postgresql/8.4/contrib/ ‘chkpass’, in the database. This type is used to store an ls encrypted field, e.g., a password. Let’s see how chkpass works for a user account table that we create and insert Create a test database called module_test: two rows into: 88  |  March 2012  | LINUX For You  |  www.LinuxForU.com
  • 2. How To Admin CREATE TABLE accounts (username varchar(100), password Using isn chkpass); This module will introduce data types to store INSERT INTO accounts(username, “password”) VALUES (‘user1’, international standard numbers like International Standard ‘pass1’); Book Numbers (ISBN), International Standard Music INSERT INTO accounts(username, “password”) VALUES (‘user2’, Numbers (ISMN), International Standard Serial Numbers ‘pass2’); (ISSN), Universal Product Codes (UPC), etc. It will also add functions to validate data, type-cast numbers from We can authenticate users with a query like the one older formats to the newer 13-digit formats, and vice- that follows: versa. Let’s test this module for storing book information: SELECT count(*) from accounts where username=’user1’ and CREATE TABLE books(number isbn13, title varchar(100)) password = ‘pass1’ INSERT INTO books(“number”, title) VALUES (‘978-03’, ‘Rework’); The ‘=’ operator uses the eq(column_name, text) in the module to test for equality. Chkpass uses the Unix The INSERT statement throws an error: Invalid crypt() function, and hence it is weak; only the first eight input syntax for ISBN number: “978-03”. However, this characters of the text are used in the algorithm. Chkpass works just fine: has limited practical use; the pgcrypto module is an effective alternative. INSERT INTO books(“number”, title) VALUES (‘978-0307463746’, ‘Rework’) Using fuzzystrmatch This module installs the soundx(), difference(), To convert a 10-digit ISBN to 13 digits, use the levenshtein() and metaphone() functions. Soundx() and isbn13() function: metaphone() are phonetic algorithms—they convert a text string to a code string based on its pronunciation. INSERT INTO books(“number”, title) VALUES Difference() and levenshtein() return a numeric value (isbn13(‘0307463745’), ‘Rework’) based on the similarity of the two input strings. Let’s now look into the levenshtein() and metaphone() (Actually, the name of the book mentioned here, functions. The Levenshtein distance between two 'Rework' by Jason Fried, happens to be my favourite strings is the minimum number of insertions, deletions book on product/project management! I have prescribed or substitutions required to convert one string to it to all my team-mates.) another. Using hstore SELECT levenshtein(‘foodlets’, ‘booklets’); You must have heard enough about NoSQL and key- value databases. It’s not always NoSQL vs relational This query returns 2, as is obvious. databases—with the hstore module, PostgreSQL The metaphone() function takes a text string and allows you to store data in the form of key-value pairs, the maximum length of the output code as its two input within a column of a table. Imagine you are processing parameters. These examples return FTLTS: spreadsheets and you have no idea about the column headers and the data type of the data in the sheets. SELECT metaphone(‘foodlets’, 6); That’s when hstore comes to your rescue! Incidentally, SELECT metaphone(‘fudlets’, 6); hstore takes keys and values as text; the value can be NULL, but not the key. Let’s create a table with a If we try to get the Levenshtein distance between the column of type hstore and insert some rows: returned strings, this returns 0: CREATE TABLE kv_data( id integer, data hstore) SELECT levenshtein(‘FTLTS’,’FTLTS’); INSERT into kv_data values (1, hstore(‘name’, ‘amit’) || hstore(‘city’, ‘bangalore’)), This means that the two words sound similar. (2, hstore(‘name’, ‘raghu’) || hstore(‘age’, ‘26’)), Fuzzystrmatch is very helpful in implementing the (3, hstore(‘name’, ‘ram’) || hstore(‘age’, ‘28’)); search feature for a website. Now the search can work with alternate spellings and misspelled keywords. Reminds you You can create your own keys like ‘height’, of the ‘Did you mean...’ feature on Google Search, right? ‘favourite_book,’ etc. The ‘||’ operator is used for www.LinuxForU.com  | LINUX For You  |  March 2012  |  89
  • 3. Admin How To concatenation. Now that we have a table and a few rows of data, let’s look at some SELECT, UPDATE and DELETE queries. To select rows with the value for ‘city’ as ‘bangalore’, use the following query: SELECT * from kv_data where data->’city’ = ‘bangalore’ To get the average age across the table (returns 27.0), use the query given below: SELECT avg((data->’age’)::integer) age from kv_data; Here, ::integer is used to type-cast the text value to an integer, so that math operations can be performed on it. To select and sort rows by ‘name’ values, use: SELECT * from kv_data order by data->’name’ desc Update the ‘city’ value to ‘delhi’ for all rows, as follows: UPDATE kv_data SET data = data || (‘city’ => ‘delhi’); Then, delete the ‘age’ key (and values) from all rows, as shown below: UPDATE kv_data set data = delete(data, ‘age’) Next, delete rows with the ‘name’ as ‘amit’: DELETE from kv_data where data->’name’ = ‘amit’ Although not a full-fledged key-value storage, hstore does provide us with the flexibility of a key-value database and the power of SQL queries. Other useful modules Here are some other modules you may find useful: • Pgcrypto provides functions for hashing and encryption. It supports SHA, MD5, Blowfish, AES and other algorithms. • Citext adds a case-insensitive text data type, which stores text in lower-case form. • Uuid-ossp provides functions to generate universally unique identifiers. • Pg_trgm adds functions to find text similarity based on trigram matching. By: Sagar Arlekar The author is a research engineer at CSTEP, Bengaluru. He works in the domains of GIS and agent-based simulations. He co-founded Foodlets.in, a visual food guide built entirely on open source technologies. 90  |  March 2012  | LINUX For You  |  www.LinuxForU.com