You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/04/26 01:44:55 UTC

[9/9] incubator-calcite git commit: [CALCITE-699] In Avatica, synchronize access to Calendar

[CALCITE-699] In Avatica, synchronize access to Calendar


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/a357e910
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/a357e910
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/a357e910

Branch: refs/heads/master
Commit: a357e910809da869e2edbad68f35346b1f5498fd
Parents: ec4b290
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Apr 24 12:11:30 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Apr 24 16:06:25 2015 -0700

----------------------------------------------------------------------
 .../avatica/AvaticaPreparedStatement.java       | 44 ++++++++++----------
 .../org/apache/calcite/avatica/AvaticaSite.java | 11 ++++-
 .../calcite/avatica/util/AbstractCursor.java    | 21 +++-------
 3 files changed, 38 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
index 4656af8..0410cfe 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
@@ -86,7 +86,17 @@ public abstract class AvaticaPreparedStatement
    * time this method is called.
    *
    * <p>Uses the calendar to offset date-time values when calling methods such
-   * as {@link #setDate(int, Date)}. */
+   * as {@link #setDate(int, Date)}.
+   *
+   * <p>A note on thread-safety. This method does not strictly need to be
+   * {@code synchronized}, because JDBC does not promise thread safety if
+   * different threads are accessing the same statement, or even different
+   * objects within a particular connection.
+   *
+   * <p>The calendar returned is to be used only within this statement, and
+   * JDBC only allows access to a statement from within one thread, so
+   * therefore does not need to be synchronized when accessed.
+   */
   protected synchronized Calendar getCalendar() {
     if (calendar == null) {
       calendar = Calendar.getInstance(connection.getTimeZone());
@@ -156,20 +166,17 @@ public abstract class AvaticaPreparedStatement
 
   public void setAsciiStream(int parameterIndex, InputStream x, int length)
       throws SQLException {
-    getSite(parameterIndex)
-        .setAsciiStream(x, length);
+    getSite(parameterIndex).setAsciiStream(x, length);
   }
 
   public void setUnicodeStream(int parameterIndex, InputStream x, int length)
       throws SQLException {
-    getSite(parameterIndex)
-        .setUnicodeStream(x, length);
+    getSite(parameterIndex).setUnicodeStream(x, length);
   }
 
   public void setBinaryStream(int parameterIndex, InputStream x, int length)
       throws SQLException {
-    getSite(parameterIndex)
-        .setBinaryStream(x, length);
+    getSite(parameterIndex).setBinaryStream(x, length);
   }
 
   public void clearParameters() throws SQLException {
@@ -180,8 +187,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setObject(int parameterIndex, Object x, int targetSqlType)
       throws SQLException {
-    getSite(parameterIndex)
-        .setObject(x, targetSqlType, getCalendar());
+    getSite(parameterIndex).setObject(x, targetSqlType);
   }
 
   public void setObject(int parameterIndex, Object x) throws SQLException {
@@ -201,8 +207,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setCharacterStream(int parameterIndex, Reader reader, int length)
       throws SQLException {
-    getSite(parameterIndex)
-        .setCharacterStream(reader, length);
+    getSite(parameterIndex).setCharacterStream(reader, length);
   }
 
   public void setRef(int parameterIndex, Ref x) throws SQLException {
@@ -227,8 +232,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setDate(int parameterIndex, Date x, Calendar calendar)
       throws SQLException {
-    getSite(parameterIndex)
-        .setDate(x, calendar);
+    getSite(parameterIndex).setDate(x, calendar);
   }
 
   public void setDate(int parameterIndex, Date x) throws SQLException {
@@ -237,8 +241,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setTime(int parameterIndex, Time x, Calendar calendar)
       throws SQLException {
-    getSite(parameterIndex)
-        .setTime(x, calendar);
+    getSite(parameterIndex).setTime(x, calendar);
   }
 
   public void setTime(int parameterIndex, Time x) throws SQLException {
@@ -247,8 +250,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setTimestamp(int parameterIndex, Timestamp x, Calendar calendar)
       throws SQLException {
-    getSite(parameterIndex)
-        .setTimestamp(x, calendar);
+    getSite(parameterIndex).setTimestamp(x, calendar);
   }
 
   public void setTimestamp(int parameterIndex, Timestamp x)
@@ -258,8 +260,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setNull(int parameterIndex, int sqlType, String typeName)
       throws SQLException {
-    getSite(parameterIndex)
-        .setNull(sqlType, typeName);
+    getSite(parameterIndex).setNull(sqlType, typeName);
   }
 
   public void setURL(int parameterIndex, URL x) throws SQLException {
@@ -268,8 +269,7 @@ public abstract class AvaticaPreparedStatement
 
   public void setObject(int parameterIndex, Object x, int targetSqlType,
       int scaleOrLength) throws SQLException {
-    getSite(parameterIndex)
-        .setObject(x, targetSqlType, scaleOrLength);
+    getSite(parameterIndex).setObject(x, targetSqlType, scaleOrLength);
   }
 
   // implement ParameterMetaData
@@ -287,7 +287,7 @@ public abstract class AvaticaPreparedStatement
 
   protected AvaticaSite getSite(int param) throws SQLException {
     final AvaticaParameter parameter = getParameter(param);
-    return new AvaticaSite(parameter, calendar, param - 1, slots);
+    return new AvaticaSite(parameter, getCalendar(), param - 1, slots);
   }
 
   public int getParameterCount() {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
index 047a8db..7fd6947 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
@@ -43,6 +43,12 @@ import java.util.Calendar;
  */
 public class AvaticaSite {
   final AvaticaParameter parameter;
+
+  /** Calendar is not thread-safe. But calendar is only used from within one
+   * thread, and we have to trust that clients are not modifying calendars
+   * that they pass to us in a method such as
+   * {@link java.sql.PreparedStatement#setTime(int, Time, Calendar)}, so we do
+   * not need to synchronize access. */
   final Calendar calendar;
   private final int index;
   final TypedValue[] slots;
@@ -53,6 +59,9 @@ public class AvaticaSite {
 
   public AvaticaSite(AvaticaParameter parameter, Calendar calendar, int index,
       TypedValue[] slots) {
+    assert calendar != null;
+    assert parameter != null;
+    assert slots != null;
     this.parameter = parameter;
     this.calendar = calendar;
     this.index = index;
@@ -189,7 +198,7 @@ public class AvaticaSite {
     slots[index] = wrap(ColumnMetaData.Rep.JAVA_SQL_DATE, x, calendar);
   }
 
-  public void setObject(Object x, int targetSqlType, Calendar calendar) {
+  public void setObject(Object x, int targetSqlType) {
     if (x == null || Types.NULL == targetSqlType) {
       setNull(targetSqlType);
       return;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
index 17ccfde..9786c7a 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
@@ -135,7 +135,7 @@ public abstract class AbstractCursor implements Cursor {
       case NUMBER:
         return new DateFromNumberAccessor(getter, localCalendar);
       case JAVA_SQL_DATE:
-        return new DateAccessor(getter, localCalendar);
+        return new DateAccessor(getter);
       default:
         throw new AssertionError("bad " + columnMetaData.type.rep);
       }
@@ -146,7 +146,7 @@ public abstract class AbstractCursor implements Cursor {
       case NUMBER:
         return new TimeFromNumberAccessor(getter, localCalendar);
       case JAVA_SQL_TIME:
-        return new TimeAccessor(getter, localCalendar);
+        return new TimeAccessor(getter);
       default:
         throw new AssertionError("bad " + columnMetaData.type.rep);
       }
@@ -157,7 +157,7 @@ public abstract class AbstractCursor implements Cursor {
       case NUMBER:
         return new TimestampFromNumberAccessor(getter, localCalendar);
       case JAVA_SQL_TIMESTAMP:
-        return new TimestampAccessor(getter, localCalendar);
+        return new TimestampAccessor(getter);
       case JAVA_UTIL_DATE:
         return new TimestampFromUtilDateAccessor(getter, localCalendar);
       default:
@@ -916,11 +916,8 @@ public abstract class AbstractCursor implements Cursor {
    * corresponds to {@link java.sql.Types#DATE}.
    */
   private static class DateAccessor extends ObjectAccessor {
-    private final Calendar localCalendar;
-
-    public DateAccessor(Getter getter, Calendar localCalendar) {
+    public DateAccessor(Getter getter) {
       super(getter);
-      this.localCalendar = localCalendar;
     }
 
     @Override public Date getDate(Calendar calendar) {
@@ -958,11 +955,8 @@ public abstract class AbstractCursor implements Cursor {
    * corresponds to {@link java.sql.Types#TIME}.
    */
   private static class TimeAccessor extends ObjectAccessor {
-    private final Calendar localCalendar;
-
-    public TimeAccessor(Getter getter, Calendar localCalendar) {
+    public TimeAccessor(Getter getter) {
       super(getter);
-      this.localCalendar = localCalendar;
     }
 
     @Override public Time getTime(Calendar calendar) {
@@ -999,11 +993,8 @@ public abstract class AbstractCursor implements Cursor {
    * corresponds to {@link java.sql.Types#TIMESTAMP}.
    */
   private static class TimestampAccessor extends ObjectAccessor {
-    private final Calendar localCalendar;
-
-    public TimestampAccessor(Getter getter, Calendar localCalendar) {
+    public TimestampAccessor(Getter getter) {
       super(getter);
-      this.localCalendar = localCalendar;
     }
 
     @Override public Timestamp getTimestamp(Calendar calendar) {