/* * Copyright (c) 2007, PostgreSQL Global Development Group * See the LICENSE file in the project root for more information. */ package org.postgresql.test.extensions; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.postgresql.core.ServerVersion; import org.postgresql.jdbc.PreferQueryMode; import org.postgresql.test.TestUtil; import org.postgresql.test.jdbc2.BaseTest4; import org.junit.Assume; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.Collections; import java.util.HashMap; import java.util.Map; // SELECT 'hstore'::regtype::oid // SELECT 'hstore[]'::regtype::oid public class HStoreTest extends BaseTest4 { private Connection _conn; @Override public void setUp() throws Exception { super.setUp(); _conn = con; Assume.assumeFalse("hstore is not supported in simple protocol only mode", preferQueryMode == PreferQueryMode.SIMPLE); Assume.assumeTrue("hstore requires PostgreSQL 8.3+", TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3)); } @Override public void tearDown() throws SQLException { TestUtil.closeDB(_conn); } @Test public void testHStoreSelect() throws SQLException { PreparedStatement pstmt = _conn.prepareStatement("SELECT 'a=>1,b=>2'::hstore"); ResultSet rs = pstmt.executeQuery(); assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1)); assertTrue(rs.next()); String str = rs.getString(1); if (!("\"a\"=>\"1\", \"b\"=>\"2\"".equals(str) || "\"b\"=>\"2\", \"a\"=>\"1\"".equals(str))) { fail("Expected " + "\"a\"=>\"1\", \"b\"=>\"2\"" + " but got " + str); } Map<String, String> correct = new HashMap<String, String>(); correct.put("a", "1"); correct.put("b", "2"); assertEquals(correct, rs.getObject(1)); } @Test public void testHStoreSelectNullValue() throws SQLException { PreparedStatement pstmt = _conn.prepareStatement("SELECT 'a=>NULL'::hstore"); ResultSet rs = pstmt.executeQuery(); assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1)); assertTrue(rs.next()); assertEquals("\"a\"=>NULL", rs.getString(1)); Map<String, Object> correct = Collections.singletonMap("a", null); assertEquals(correct, rs.getObject(1)); } @Test public void testHStoreSend() throws SQLException { Map<String, Integer> correct = Collections.singletonMap("a", 1); PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text"); pstmt.setObject(1, correct); ResultSet rs = pstmt.executeQuery(); assertEquals(String.class.getName(), rs.getMetaData().getColumnClassName(1)); assertTrue(rs.next()); assertEquals("\"a\"=>\"1\"", rs.getString(1)); } @Test public void testHStoreUsingPSSetObject4() throws SQLException { Map<String, Integer> correct = Collections.singletonMap("a", 1); PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text"); pstmt.setObject(1, correct, Types.OTHER, -1); ResultSet rs = pstmt.executeQuery(); assertEquals(String.class.getName(), rs.getMetaData().getColumnClassName(1)); assertTrue(rs.next()); assertEquals("\"a\"=>\"1\"", rs.getString(1)); } @Test public void testHStoreSendEscaped() throws SQLException { Map<String, String> correct = Collections.singletonMap("a", "t'e\ns\"t"); PreparedStatement pstmt = _conn.prepareStatement("SELECT ?"); pstmt.setObject(1, correct); ResultSet rs = pstmt.executeQuery(); assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1)); assertTrue(rs.next()); assertEquals(correct, rs.getObject(1)); assertEquals("\"a\"=>\"t'e\ns\\\"t\"", rs.getString(1)); } }