From 2843a13e512d1d1deda4f9b6fe504db8d640c91a Mon Sep 17 00:00:00 2001
From: Barry Lind <barry@xythos.com>
Date: Tue, 15 Jan 2002 07:37:33 +0000
Subject: [PATCH] Applied patch submitted by Ryouichi Matsuda
 (r-matuda@sra.co.jp) that fixed a problem with leading zeros being lost on
 fractional seconds when setting a timestamp value on a PreparedStatement.

---
 .../org/postgresql/jdbc1/PreparedStatement.java     | 13 ++++++++++++-
 .../org/postgresql/jdbc2/PreparedStatement.java     | 12 +++++++++++-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
index 1da1da6711..31bbaf2eec 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
@@ -388,8 +388,19 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
 		{
 			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 			df.setTimeZone(TimeZone.getTimeZone("GMT"));
+
+			// Make decimal from nanos.
+			StringBuffer decimal = new StringBuffer("000000000");	// max nanos length
+			String nanos = String.valueOf(x.getNanos());
+                        decimal.setLength(decimal.length() - nanos.length());
+			decimal.append(nanos);
+			if (! connection.haveMinimumServerVersion("7.2")) {
+				// Because 7.1 include bug that "hh:mm:59.999" becomes "hh:mm:60.00".
+				decimal.setLength(2);
+			}
+
 			StringBuffer strBuf = new StringBuffer("'");
-			strBuf.append(df.format(x)).append('.').append(x.getNanos() / 10000000).append("+00'");
+			strBuf.append(df.format(x)).append('.').append(decimal).append("+00'");
 			set(parameterIndex, strBuf.toString());
 		}
 	}
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
index d5418bd1be..49c5f2da80 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
@@ -412,11 +412,21 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
 				tl_tsdf.set(df);
 			}
 
+			// Make decimal from nanos.
+			StringBuffer decimal = new StringBuffer("000000000");	// max nanos length
+			String nanos = String.valueOf(x.getNanos());
+                        decimal.setLength(decimal.length() - nanos.length());
+			decimal.append(nanos);
+			if (! connection.haveMinimumServerVersion("7.2")) {
+				// Because 7.1 include bug that "hh:mm:59.999" becomes "hh:mm:60.00".
+				decimal.setLength(2);
+			}
+
 			// Use the shared StringBuffer
 			synchronized (sbuf)
 			{
 				sbuf.setLength(0);
-				sbuf.append("'").append(df.format(x)).append('.').append(x.getNanos() / 10000000).append("+00'");
+				sbuf.append("'").append(df.format(x)).append('.').append(decimal).append("+00'");
 				set(parameterIndex, sbuf.toString());
 			}
 
-- 
2.24.1