3939import java .sql .SQLType ;
4040import java .sql .SQLXML ;
4141import java .sql .Statement ;
42+ import java .sql .Struct ;
4243import java .sql .Time ;
4344import java .sql .Timestamp ;
4445import java .time .Instant ;
@@ -749,102 +750,84 @@ public final int executeUpdate(String sql, String[] columnNames) throws SQLExcep
749750 "executeUpdate(String, String[]) cannot be called in PreparedStatement or CallableStatement!" ,
750751 ExceptionUtils .SQL_STATE_WRONG_OBJECT_TYPE );
751752 }
752- private static String encodeObject (Object x ) throws SQLException {
753+ private String encodeObject (Object x ) throws SQLException {
753754 return encodeObject (x , null );
754755 }
756+
757+ private static final char QUOTE = '\'' ;
755758
756- private static String encodeObject (Object x , Long length ) throws SQLException {
759+ private String encodeObject (Object x , Long length ) throws SQLException {
757760 LOG .trace ("Encoding object: {}" , x );
758761
759762 try {
760763 if (x == null ) {
761764 return "NULL" ;
762765 } else if (x instanceof String ) {
763- return "'" + SQLUtils .escapeSingleQuotes ((String ) x ) + "'" ;
766+ return QUOTE + SQLUtils .escapeSingleQuotes ((String ) x ) + QUOTE ;
764767 } else if (x instanceof Boolean ) {
765768 return (Boolean ) x ? "1" : "0" ;
766769 } else if (x instanceof Date ) {
767- return "'" + DataTypeUtils .DATE_FORMATTER .format (((Date ) x ).toLocalDate ()) + "'" ;
770+ return QUOTE + DataTypeUtils .DATE_FORMATTER .format (((Date ) x ).toLocalDate ()) + QUOTE ;
768771 } else if (x instanceof LocalDate ) {
769- return "'" + DataTypeUtils .DATE_FORMATTER .format ((LocalDate ) x ) + "'" ;
772+ return QUOTE + DataTypeUtils .DATE_FORMATTER .format ((LocalDate ) x ) + QUOTE ;
770773 } else if (x instanceof Time ) {
771- return "'" + TIME_FORMATTER .format (((Time ) x ).toLocalTime ()) + "'" ;
774+ return QUOTE + TIME_FORMATTER .format (((Time ) x ).toLocalTime ()) + QUOTE ;
772775 } else if (x instanceof LocalTime ) {
773- return "'" + TIME_FORMATTER .format ((LocalTime ) x ) + "'" ;
776+ return QUOTE + TIME_FORMATTER .format ((LocalTime ) x ) + QUOTE ;
774777 } else if (x instanceof Timestamp ) {
775- return "'" + DATETIME_FORMATTER .format (((Timestamp ) x ).toLocalDateTime ()) + "'" ;
778+ return QUOTE + DATETIME_FORMATTER .format (((Timestamp ) x ).toLocalDateTime ()) + QUOTE ;
776779 } else if (x instanceof LocalDateTime ) {
777- return "'" + DATETIME_FORMATTER .format ((LocalDateTime ) x ) + "'" ;
780+ return QUOTE + DATETIME_FORMATTER .format ((LocalDateTime ) x ) + QUOTE ;
778781 } else if (x instanceof OffsetDateTime ) {
779782 return encodeObject (((OffsetDateTime ) x ).toInstant ());
780783 } else if (x instanceof ZonedDateTime ) {
781784 return encodeObject (((ZonedDateTime ) x ).toInstant ());
782785 } else if (x instanceof Instant ) {
783786 return "fromUnixTimestamp64Nano(" + (((Instant ) x ).getEpochSecond () * 1_000_000_000L + ((Instant ) x ).getNano ()) + ")" ;
784787 } else if (x instanceof InetAddress ) {
785- return "'" + ((InetAddress ) x ).getHostAddress () + "'" ;
788+ return QUOTE + ((InetAddress ) x ).getHostAddress () + QUOTE ;
786789 } else if (x instanceof java .sql .Array ) {
787790 StringBuilder listString = new StringBuilder ();
788- listString .append ("[" );
789- int i = 0 ;
790- for (Object item : (Object []) ((Array ) x ).getArray ()) {
791- if (i > 0 ) {
792- listString .append (", " );
793- }
794- listString .append (encodeObject (item ));
795- i ++;
796- }
797- listString .append ("]" );
791+ listString .append ('[' );
792+ appendArrayElements ((Object []) ((Array ) x ).getArray (), listString );
793+ listString .append (']' );
798794
799795 return listString .toString ();
800796 } else if (x .getClass ().isArray ()) {
801797 StringBuilder listString = new StringBuilder ();
802- listString .append ("[" );
803-
804-
798+ listString .append ('[' );
805799 if (x .getClass ().getComponentType ().isPrimitive ()) {
806800 int len = java .lang .reflect .Array .getLength (x );
807801 for (int i = 0 ; i < len ; i ++) {
808- if (i > 0 ) {
809- listString .append (", " );
810- }
811- listString .append (encodeObject (java .lang .reflect .Array .get (x , i )));
802+ listString .append (encodeObject (java .lang .reflect .Array .get (x , i ))).append (',' );
812803 }
804+ listString .setLength (listString .length () - 1 );
813805 } else {
814- int i = 0 ;
815- for (Object item : (Object []) x ) {
816- if (i > 0 ) {
817- listString .append (", " );
818- }
819- listString .append (encodeObject (item ));
820- i ++;
821- }
806+ appendArrayElements ((Object []) x , listString );
822807 }
823- listString .append ("]" );
808+ listString .append (']' );
824809
825810 return listString .toString ();
826811 } else if (x instanceof Collection ) {
827812 StringBuilder listString = new StringBuilder ();
828- listString .append ("[" );
813+ listString .append ('[' );
829814 for (Object item : (Collection <?>) x ) {
830- listString .append (encodeObject (item )).append (", " );
831- }
832- if (listString .length () > 1 ) {
833- listString .delete (listString .length () - 2 , listString .length ());
815+ listString .append (encodeObject (item )).append (',' );
834816 }
835- listString .append ("]" );
817+ listString .setLength (listString .length () - 1 );
818+ listString .append (']' );
836819
837820 return listString .toString ();
838821 } else if (x instanceof Map ) {
839822 Map <?, ?> tmpMap = (Map <?, ?>) x ;
840823 StringBuilder mapString = new StringBuilder ();
841- mapString .append ("{" );
824+ mapString .append ('{' );
842825 for (Object key : tmpMap .keySet ()) {
843- mapString .append (encodeObject (key )).append (": " ).append (encodeObject (tmpMap .get (key ))).append (", " );
826+ mapString .append (encodeObject (key )).append (": " ).append (encodeObject (tmpMap .get (key ))).append (',' );
844827 }
845828 if (!tmpMap .isEmpty ())
846829 mapString .delete (mapString .length () - 2 , mapString .length ());
847- mapString .append ("}" );
830+ mapString .append ('}' );
848831
849832 return mapString .toString ();
850833 } else if (x instanceof Reader ) {
@@ -853,35 +836,16 @@ private static String encodeObject(Object x, Long length) throws SQLException {
853836 return encodeCharacterStream ((InputStream ) x , length );
854837 } else if (x instanceof Object []) {
855838 StringBuilder arrayString = new StringBuilder ();
856- arrayString .append ("[" );
857- int i = 0 ;
858- for (Object item : (Object []) x ) {
859- if (i > 0 ) {
860- arrayString .append (", " );
861- }
862- arrayString .append (encodeObject (item ));
863- i ++;
864- }
865- arrayString .append ("]" );
866-
839+ arrayString .append ('[' );
840+ appendArrayElements ((Object []) x , arrayString );
841+ arrayString .append (']' );
867842 return arrayString .toString ();
868843 } else if (x instanceof Tuple ) {
869- StringBuilder tupleString = new StringBuilder ();
870- tupleString .append ("(" );
871- Tuple t = (Tuple ) x ;
872- Object [] values = t .getValues ();
873- int i = 0 ;
874- for (Object item : values ) {
875- if (i > 0 ) {
876- tupleString .append (", " );
877- }
878- tupleString .append (encodeObject (item ));
879- i ++;
880- }
881- tupleString .append (")" );
882- return tupleString .toString ();
844+ return arrayToTuple (((Tuple )x ).getValues ());
845+ } else if (x instanceof Struct ) {
846+ return arrayToTuple (((Struct )x ).getAttributes ());
883847 } else if (x instanceof UUID ) {
884- return "'" + ((UUID ) x ).toString () + "'" ;
848+ return QUOTE + ((UUID ) x ).toString () + QUOTE ;
885849 }
886850
887851 return SQLUtils .escapeSingleQuotes (x .toString ()); //Escape single quotes
@@ -891,6 +855,21 @@ private static String encodeObject(Object x, Long length) throws SQLException {
891855 }
892856 }
893857
858+ private void appendArrayElements (Object [] array , StringBuilder sb ) throws SQLException {
859+ for (Object item : array ) {
860+ sb .append (encodeObject (item )).append (',' );
861+ }
862+ sb .setLength (sb .length () - 1 );
863+ }
864+
865+ private String arrayToTuple (Object [] array ) throws SQLException {
866+ StringBuilder tupleString = new StringBuilder ();
867+ tupleString .append ('(' );
868+ appendArrayElements (array , tupleString );
869+ tupleString .append (')' );
870+ return tupleString .toString ();
871+ }
872+
894873 private static String encodeCharacterStream (InputStream stream , Long length ) throws SQLException {
895874 return encodeCharacterStream (new InputStreamReader (stream , StandardCharsets .UTF_8 ), length );
896875 }
0 commit comments