!151 [bugfix] 修复b兼容模式下timestamp(0)类型查询时结果不正确的问题
Merge pull request !151 from 周斌/timestamp
This commit is contained in:
		@ -537,6 +537,11 @@ public enum PGProperty {
 | 
			
		||||
   */
 | 
			
		||||
  HEARTBEAT_PERIOD("heartbeatPeriod", "0", "heartbeat interval time"),
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * It is used to change timestamp parameter in TimestampUtils convert.
 | 
			
		||||
   */
 | 
			
		||||
  TIMESTAMP_NANO_FORMAT("timestampNanoFormat", "0", "0 main's already add nana seconds. 1 mains nano<1000 will not add"),
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * In the scenario where heartbeat maintenance is enabled for the active node,
 | 
			
		||||
   * if the active node is down, set the timeout threshold for searching for the active node.
 | 
			
		||||
 | 
			
		||||
@ -313,6 +313,7 @@ public class PgConnection implements BaseConnection {
 | 
			
		||||
        return queryExecutor.getTimeZone();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
    timestampUtils.setTimestampNanoFormat(PGProperty.TIMESTAMP_NANO_FORMAT.getInteger(info));
 | 
			
		||||
 | 
			
		||||
    // Initialize common queries.
 | 
			
		||||
    // isParameterized==true so full parse is performed and the engine knows the query
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,7 @@ public class TimestampUtils {
 | 
			
		||||
 | 
			
		||||
  private TimeZone prevDefaultZoneFieldValue;
 | 
			
		||||
  private TimeZone defaultTimeZoneCache;
 | 
			
		||||
  private int timestampNanoFormat = 0;
 | 
			
		||||
 | 
			
		||||
  static {
 | 
			
		||||
    // The expected maximum value is 60 (seconds), so 64 is used "just in case"
 | 
			
		||||
@ -131,6 +132,10 @@ public class TimestampUtils {
 | 
			
		||||
    this.timeZoneProvider = timeZoneProvider;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  public void setTimestampNanoFormat(int format) {
 | 
			
		||||
    this.timestampNanoFormat = format;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private Calendar getCalendar(int sign, int hr, int min, int sec) {
 | 
			
		||||
    int rawOffset = sign * (((hr * 60 + min) * 60 + sec) * 1000);
 | 
			
		||||
    if (calCache != null && calCacheZone == rawOffset) {
 | 
			
		||||
@ -661,7 +666,7 @@ public class TimestampUtils {
 | 
			
		||||
 | 
			
		||||
    appendDate(sbuf, cal);
 | 
			
		||||
    sbuf.append(' ');
 | 
			
		||||
    appendTime(sbuf, cal, nanos);
 | 
			
		||||
    appendTime(sbuf, cal, nanos, timestampNanoFormat);
 | 
			
		||||
    if (withTimeZone) {
 | 
			
		||||
      appendTimeZone(sbuf, cal);
 | 
			
		||||
    }
 | 
			
		||||
@ -708,7 +713,7 @@ public class TimestampUtils {
 | 
			
		||||
 | 
			
		||||
    sbuf.setLength(0);
 | 
			
		||||
 | 
			
		||||
    appendTime(sbuf, cal, cal.get(Calendar.MILLISECOND) * 1000000);
 | 
			
		||||
    appendTime(sbuf, cal, cal.get(Calendar.MILLISECOND) * 1000000, timestampNanoFormat);
 | 
			
		||||
 | 
			
		||||
    // The 'time' parser for <= 7.3 doesn't like timezones.
 | 
			
		||||
    if (withTimeZone) {
 | 
			
		||||
@ -742,11 +747,11 @@ public class TimestampUtils {
 | 
			
		||||
    sb.append(NUMBERS[day]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static void appendTime(StringBuilder sb, Calendar cal, int nanos) {
 | 
			
		||||
  private static void appendTime(StringBuilder sb, Calendar cal, int nanos, int format) {
 | 
			
		||||
    int hours = cal.get(Calendar.HOUR_OF_DAY);
 | 
			
		||||
    int minutes = cal.get(Calendar.MINUTE);
 | 
			
		||||
    int seconds = cal.get(Calendar.SECOND);
 | 
			
		||||
    appendTime(sb, hours, minutes, seconds, nanos);
 | 
			
		||||
    appendTime(sb, hours, minutes, seconds, nanos, format);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@ -759,7 +764,7 @@ public class TimestampUtils {
 | 
			
		||||
   * @param seconds seconds
 | 
			
		||||
   * @param nanos nanoseconds
 | 
			
		||||
   */
 | 
			
		||||
  private static void appendTime(StringBuilder sb, int hours, int minutes, int seconds, int nanos) {
 | 
			
		||||
  private static void appendTime(StringBuilder sb, int hours, int minutes, int seconds, int nanos, int format) {
 | 
			
		||||
    sb.append(NUMBERS[hours]);
 | 
			
		||||
 | 
			
		||||
    sb.append(':');
 | 
			
		||||
@ -773,21 +778,24 @@ public class TimestampUtils {
 | 
			
		||||
    // a two digit fractional second, but we don't need to support 7.1
 | 
			
		||||
    // anymore and getting the version number here is difficult.
 | 
			
		||||
    //
 | 
			
		||||
    if (nanos < 1000) {
 | 
			
		||||
    if (nanos < 1000 && format != 0) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    sb.append('.');
 | 
			
		||||
    int len = sb.length();
 | 
			
		||||
    sb.append(nanos / 1000); // append microseconds
 | 
			
		||||
    int needZeros = 6 - (sb.length() - len);
 | 
			
		||||
    final int NANO_BITS = 6;
 | 
			
		||||
    int needZeros = NANO_BITS - (sb.length() - len);
 | 
			
		||||
    if (needZeros > 0) {
 | 
			
		||||
      sb.insert(len, ZEROS, 0, needZeros);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int end = sb.length() - 1;
 | 
			
		||||
    while (sb.charAt(end) == '0') {
 | 
			
		||||
    int needDelete = NANO_BITS - 1;
 | 
			
		||||
    while (sb.charAt(end) == '0' && needDelete != 0) {
 | 
			
		||||
      sb.deleteCharAt(end);
 | 
			
		||||
      end--;
 | 
			
		||||
      needDelete --;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -855,7 +863,7 @@ public class TimestampUtils {
 | 
			
		||||
      // it relies on the fact that appendTime just truncates 000..999 nanosecond part
 | 
			
		||||
      localTime = localTime.plus(ONE_MICROSECOND);
 | 
			
		||||
    }
 | 
			
		||||
    appendTime(sbuf, localTime);
 | 
			
		||||
    appendTime(sbuf, localTime, timestampNanoFormat);
 | 
			
		||||
 | 
			
		||||
    return sbuf.toString();
 | 
			
		||||
  }
 | 
			
		||||
@ -879,7 +887,7 @@ public class TimestampUtils {
 | 
			
		||||
    LocalDate localDate = localDateTime.toLocalDate();
 | 
			
		||||
    appendDate(sbuf, localDate);
 | 
			
		||||
    sbuf.append(' ');
 | 
			
		||||
    appendTime(sbuf, localDateTime.toLocalTime());
 | 
			
		||||
    appendTime(sbuf, localDateTime.toLocalTime(), timestampNanoFormat);
 | 
			
		||||
    appendTimeZone(sbuf, offsetDateTime.getOffset());
 | 
			
		||||
    appendEra(sbuf, localDate);
 | 
			
		||||
 | 
			
		||||
@ -911,12 +919,12 @@ public class TimestampUtils {
 | 
			
		||||
    appendDate(sb, year, month, day);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static void appendTime(StringBuilder sb, LocalTime localTime) {
 | 
			
		||||
  private static void appendTime(StringBuilder sb, LocalTime localTime, int format) {
 | 
			
		||||
    int hours = localTime.getHour();
 | 
			
		||||
    int minutes = localTime.getMinute();
 | 
			
		||||
    int seconds = localTime.getSecond();
 | 
			
		||||
    int nanos = localTime.getNano();
 | 
			
		||||
    appendTime(sb, hours, minutes, seconds, nanos);
 | 
			
		||||
    appendTime(sb, hours, minutes, seconds, nanos, format);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void appendTimeZone(StringBuilder sb, java.time.ZoneOffset offset) {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user