postgresql-jdbc.git / summary / log / commit / refs

commit    a960a65ab0d0959c02007fbbc4b8801f3b9385ae
Author:   Oliver Jowett <oliver@opencloud.com>
Date:     Tue Jan 18 21:33:18 2005 +0000

    Bugfixes and tests for two date-related bugs:
    
    The jdbc escaped scalar function dayofweek should return values between
    1 and 7 (1 for sunday) unlike the backend "extract dow" function which is
    zero-based.
    
    The literal escaped values for date/time/timestamp were not explicitly casted
    which causes some problems. For example:
    
      extract( dow from '2005-01-17 12:00:00')
    
    generates an error, but the following is accepted:
    
      extract( dow from TIMESTAMP '2005-01-17 12:00:00')
    
    Bug report and patch from Xavier Poinsard.


org/postgresql/jdbc2/AbstractJdbc2Statement.java | 13 +++++++++++-- org/postgresql/jdbc2/EscapedFunctions.java | 7 ++++--- org/postgresql/test/jdbc2/StatementTest.java | 6 ++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/org/postgresql/jdbc2/AbstractJdbc2Statement.java b/org/postgresql/jdbc2/AbstractJdbc2Statement.java index ab603743..4779cebf 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2Statement.java +++ b/org/postgresql/jdbc2/AbstractJdbc2Statement.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v 1.62 2005/01/14 01:20:19 oliver Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v 1.63 2005/01/15 07:53:02 oliver Exp $ * *------------------------------------------------------------------------- */ @@ -756,12 +756,21 @@ public abstract class AbstractJdbc2Statement implements BaseStatement { state = ESC_TIMEDATE; i++; + newsql.append("DATE "); break; } else if (next == 't' || next == 'T') { state = ESC_TIMEDATE; - i += (nextnext == 's' || nextnext == 'S') ? 2 : 1; + if (nextnext == 's' || nextnext == 'S'){ + // timestamp constant + i+=2; + newsql.append("TIMESTAMP "); + }else{ + // time constant + i++; + newsql.append("TIME "); + } break; } else if ( next == 'f' || next == 'F' ) diff --git a/org/postgresql/jdbc2/EscapedFunctions.java b/org/postgresql/jdbc2/EscapedFunctions.java index c32ae8d9..c412ac2f 100644 --- a/org/postgresql/jdbc2/EscapedFunctions.java +++ b/org/postgresql/jdbc2/EscapedFunctions.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/EscapedFunctions.java,v 1.2 2005/01/11 08:25:46 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/EscapedFunctions.java,v 1.3 2005/01/14 01:20:20 oliver Exp $ * *------------------------------------------------------------------------- */ @@ -399,13 +399,14 @@ public class EscapedFunctions { return "extract(day from "+parsedArgs.get(0)+")"; } - /** dayofweek translation */ + /** dayofweek translation + * adding 1 to postgresql function since we expect values from 1 to 7 */ public static String sqldayofweek(List parsedArgs) throws SQLException{ if (parsedArgs.size()!=1){ throw new PSQLException(GT.tr("{0} function takes one and only one argument.","dayofweek"), PSQLState.SYNTAX_ERROR); } - return "extract(dow from "+parsedArgs.get(0)+")"; + return "extract(dow from "+parsedArgs.get(0)+")+1"; } /** dayofyear translation */ diff --git a/org/postgresql/test/jdbc2/StatementTest.java b/org/postgresql/test/jdbc2/StatementTest.java index 792ba27d..92560f3a 100644 --- a/org/postgresql/test/jdbc2/StatementTest.java +++ b/org/postgresql/test/jdbc2/StatementTest.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/StatementTest.java,v 1.12 2004/12/22 22:59:05 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/StatementTest.java,v 1.13 2005/01/11 08:25:48 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -267,13 +267,15 @@ public class StatementTest extends TestCase Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select {fn curdate()},{fn curtime()}" + ",{fn dayname({fn now()})}, {fn dayofmonth({fn now()})}" + - ",{fn dayofweek({fn now()})},{fn dayofyear({fn now()})}" + + ",{fn dayofweek({ts '2005-01-17 12:00:00'})},{fn dayofyear({fn now()})}" + ",{fn hour({fn now()})},{fn minute({fn now()})}" + ",{fn month({fn now()})}" + ",{fn monthname({fn now()})},{fn quarter({fn now()})}" + ",{fn second({fn now()})},{fn week({fn now()})}" + ",{fn year({fn now()})} "); assertTrue(rs.next()); + // ensure sunday =>1 and monday =>2 + assertEquals(2,rs.getInt(5)); } public void testSystemFunctions() throws SQLException [parent: 8da0216ed54a]