v2/jdbc-common/src/main/java/com/google/cloud/teleport/v2/utils/JdbcConverters.java [66:137]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    public TableRow mapRow(ResultSet resultSet) throws Exception {
      ResultSetMetaData metaData = resultSet.getMetaData();

      TableRow outputTableRow = new TableRow();

      for (int i = 1; i <= metaData.getColumnCount(); i++) {
        if (resultSet.getObject(i) == null) {
          outputTableRow.set(getColumnRef(metaData, i), resultSet.getObject(i));
          continue;
        }

        // Arrays have to be handled differently, as circular reference can stack overflow on
        // Postgres
        if (metaData.getColumnClassName(i) != null
            && metaData.getColumnClassName(i).equals("java.sql.Array")) {
          Array array = resultSet.getArray(i);
          List<Object> textList = Arrays.asList((Object[]) array.getArray());
          outputTableRow.set(getColumnRef(metaData, i), textList);
        } else {

          /*
           * DATE:      EPOCH MILLISECONDS -> yyyy-MM-dd
           * DATETIME:  EPOCH MICROSECONDS -> yyyy-MM-dd HH:mm:ss.SSSSSS
           * TIMESTAMP: EPOCH MICROSECONDS -> yyyy-MM-dd HH:mm:ss.SSSSSSXXX
           *
           * MySQL drivers have ColumnTypeName in all caps and postgres in small case
           */
          switch (metaData.getColumnTypeName(i).toLowerCase()) {
            case "date":
              outputTableRow.set(
                  getColumnRef(metaData, i),
                  DATE_FORMATTER.format(resultSet.getDate(i).toLocalDate()));
              break;
            case "datetime":
              Object timeObject = resultSet.getObject(i);

              if (timeObject instanceof TemporalAccessor) {
                outputTableRow.set(
                    getColumnRef(metaData, i),
                    DATETIME_FORMATTER.format((TemporalAccessor) timeObject));
              } else {
                Timestamp ts = resultSet.getTimestamp(i);
                // getTimestamp() returns timestamps in the default (JVM) time zone by default:
                OffsetDateTime odt = ts.toInstant().atZone(DEFAULT_TIME_ZONE_ID).toOffsetDateTime();
                outputTableRow.set(getColumnRef(metaData, i), TIMESTAMP_FORMATTER.format(odt));
              }
              break;
            case "timestamp":
              Timestamp ts = resultSet.getTimestamp(i);
              // getTimestamp() returns timestamps in the default (JVM) time zone by default:
              OffsetDateTime odt = ts.toInstant().atZone(DEFAULT_TIME_ZONE_ID).toOffsetDateTime();
              outputTableRow.set(getColumnRef(metaData, i), TIMESTAMP_FORMATTER.format(odt));
              break;
            case "clob":
              Clob clobObject = resultSet.getClob(i);
              if (clobObject.length() > Integer.MAX_VALUE) {
                LOG.warn(
                    "The Clob value size {} in column {} exceeds 2GB and will be truncated.",
                    clobObject.length(),
                    getColumnRef(metaData, i));
              }
              outputTableRow.set(
                  getColumnRef(metaData, i), clobObject.getSubString(1, (int) clobObject.length()));
              break;
            default:
              outputTableRow.set(getColumnRef(metaData, i), resultSet.getObject(i));
          }
        }
      }

      return outputTableRow;
    }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



v1/src/main/java/com/google/cloud/teleport/templates/common/JdbcConverters.java [205:276]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    public TableRow mapRow(ResultSet resultSet) throws Exception {
      ResultSetMetaData metaData = resultSet.getMetaData();

      TableRow outputTableRow = new TableRow();

      for (int i = 1; i <= metaData.getColumnCount(); i++) {
        if (resultSet.getObject(i) == null) {
          outputTableRow.set(getColumnRef(metaData, i), resultSet.getObject(i));
          continue;
        }

        // Arrays have to be handled differently, as circular reference can stack overflow on
        // Postgres
        if (metaData.getColumnClassName(i) != null
            && metaData.getColumnClassName(i).equals("java.sql.Array")) {
          Array array = resultSet.getArray(i);
          List<Object> textList = Arrays.asList((Object[]) array.getArray());
          outputTableRow.set(getColumnRef(metaData, i), textList);
        } else {

          /*
           * DATE:      EPOCH MILLISECONDS -> yyyy-MM-dd
           * DATETIME:  EPOCH MICROSECONDS -> yyyy-MM-dd HH:mm:ss.SSSSSS
           * TIMESTAMP: EPOCH MICROSECONDS -> yyyy-MM-dd HH:mm:ss.SSSSSSXXX
           *
           * MySQL drivers have ColumnTypeName in all caps and postgres in small case
           */
          switch (metaData.getColumnTypeName(i).toLowerCase()) {
            case "date":
              outputTableRow.set(
                  getColumnRef(metaData, i),
                  DATE_FORMATTER.format(resultSet.getDate(i).toLocalDate()));
              break;
            case "datetime":
              Object timeObject = resultSet.getObject(i);

              if (timeObject instanceof TemporalAccessor) {
                outputTableRow.set(
                    getColumnRef(metaData, i),
                    DATETIME_FORMATTER.format((TemporalAccessor) timeObject));
              } else {
                Timestamp ts = resultSet.getTimestamp(i);
                // getTimestamp() returns timestamps in the default (JVM) time zone by default:
                OffsetDateTime odt = ts.toInstant().atZone(DEFAULT_TIME_ZONE_ID).toOffsetDateTime();
                outputTableRow.set(getColumnRef(metaData, i), TIMESTAMP_FORMATTER.format(odt));
              }
              break;
            case "timestamp":
              Timestamp ts = resultSet.getTimestamp(i);
              // getTimestamp() returns timestamps in the default (JVM) time zone by default:
              OffsetDateTime odt = ts.toInstant().atZone(DEFAULT_TIME_ZONE_ID).toOffsetDateTime();
              outputTableRow.set(getColumnRef(metaData, i), TIMESTAMP_FORMATTER.format(odt));
              break;
            case "clob":
              Clob clobObject = resultSet.getClob(i);
              if (clobObject.length() > Integer.MAX_VALUE) {
                LOG.warn(
                    "The Clob value size {} in column {} exceeds 2GB and will be truncated.",
                    clobObject.length(),
                    getColumnRef(metaData, i));
              }
              outputTableRow.set(
                  getColumnRef(metaData, i), clobObject.getSubString(1, (int) clobObject.length()));
              break;
            default:
              outputTableRow.set(getColumnRef(metaData, i), resultSet.getObject(i));
          }
        }
      }

      return outputTableRow;
    }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



