Skip to content

Commit 92cfe0d

Browse files
authored
Execute cstmt directly - Additional testing and changes (#2284)
* Additional testing & changes for executing cstmt directly * Moved helper to statement class * Code review adjustments * Removed duped logs
1 parent 66092a2 commit 92cfe0d

File tree

6 files changed

+475
-266
lines changed

6 files changed

+475
-266
lines changed

src/main/java/com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.java

+76-16
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,26 @@ enum CallableStatementGetterSetterMethod {
115115

116116
@Override
117117
public void registerOutParameter(int index, int sqlType) throws SQLServerException {
118+
// Register output parameter by index
119+
isSetByIndex = true;
120+
if (!connection.getUseFlexibleCallableStatements() && isSetByName && isSetByIndex) {
121+
SQLServerException.makeFromDriverError(connection, this,
122+
SQLServerException.getErrString("R_noNamedAndIndexedParameters"), null, false);
123+
}
124+
registerOutputParameter(index, sqlType);
125+
}
126+
127+
private void registerOutParameterByName(int index, int sqlType) throws SQLServerException {
128+
// Register output parameter by name -- findColumn() sets the 'setByName' flag
129+
registerOutputParameter(index, sqlType);
130+
}
131+
132+
void registerOutParameterNonPLP(int index, int sqlType) throws SQLServerException {
133+
registerOutParameter(index, sqlType);
134+
inOutParam[index - 1].isNonPLP = true;
135+
}
136+
137+
private void registerOutputParameter(int index, int sqlType) throws SQLServerException {
118138
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
119139
loggerExternal.entering(getClassNameLogging(), "registerOutParameter", new Object[] {index, sqlType});
120140
checkClosed();
@@ -171,11 +191,6 @@ public void registerOutParameter(int index, int sqlType) throws SQLServerExcepti
171191
loggerExternal.exiting(getClassNameLogging(), "registerOutParameter");
172192
}
173193

174-
void registerOutParameterNonPLP(int index, int sqlType) throws SQLServerException {
175-
registerOutParameter(index, sqlType);
176-
inOutParam[index - 1].isNonPLP = true;
177-
}
178-
179194
/**
180195
* Locate any output parameter values returned from the procedure call
181196
*/
@@ -542,6 +557,7 @@ private Object getSQLXMLInternal(int parameterIndex) throws SQLServerException {
542557

543558
@Override
544559
public int getInt(int index) throws SQLServerException {
560+
setByIndex();
545561
loggerExternal.entering(getClassNameLogging(), "getInt", index);
546562
checkClosed();
547563
Integer value = (Integer) getValue(index, JDBCType.INTEGER);
@@ -561,6 +577,7 @@ public int getInt(String parameterName) throws SQLServerException {
561577

562578
@Override
563579
public String getString(int index) throws SQLServerException {
580+
setByIndex();
564581
loggerExternal.entering(getClassNameLogging(), "getString", index);
565582
checkClosed();
566583
String value = null;
@@ -588,6 +605,7 @@ public String getString(String parameterName) throws SQLServerException {
588605

589606
@Override
590607
public final String getNString(int parameterIndex) throws SQLException {
608+
setByIndex();
591609
loggerExternal.entering(getClassNameLogging(), "getNString", parameterIndex);
592610
checkClosed();
593611
String value = (String) getValue(parameterIndex, JDBCType.NCHAR);
@@ -611,6 +629,7 @@ public final String getNString(String parameterName) throws SQLException {
611629
@Deprecated(since = "6.5.4")
612630
@Override
613631
public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException {
632+
setByIndex();
614633
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
615634
loggerExternal.entering(getClassNameLogging(), "getBigDecimal", new Object[] {parameterIndex, scale});
616635
checkClosed();
@@ -640,6 +659,7 @@ public BigDecimal getBigDecimal(String parameterName, int scale) throws SQLServe
640659

641660
@Override
642661
public boolean getBoolean(int index) throws SQLServerException {
662+
setByIndex();
643663
loggerExternal.entering(getClassNameLogging(), "getBoolean", index);
644664
checkClosed();
645665
Boolean value = (Boolean) getValue(index, JDBCType.BIT);
@@ -659,6 +679,7 @@ public boolean getBoolean(String parameterName) throws SQLServerException {
659679

660680
@Override
661681
public byte getByte(int index) throws SQLServerException {
682+
setByIndex();
662683
loggerExternal.entering(getClassNameLogging(), "getByte", index);
663684
checkClosed();
664685
Short shortValue = (Short) getValue(index, JDBCType.TINYINT);
@@ -680,6 +701,7 @@ public byte getByte(String parameterName) throws SQLServerException {
680701

681702
@Override
682703
public byte[] getBytes(int index) throws SQLServerException {
704+
setByIndex();
683705
loggerExternal.entering(getClassNameLogging(), "getBytes", index);
684706
checkClosed();
685707
byte[] value = (byte[]) getValue(index, JDBCType.BINARY);
@@ -699,6 +721,7 @@ public byte[] getBytes(String parameterName) throws SQLServerException {
699721

700722
@Override
701723
public Date getDate(int index) throws SQLServerException {
724+
setByIndex();
702725
loggerExternal.entering(getClassNameLogging(), "getDate", index);
703726
checkClosed();
704727
java.sql.Date value = (java.sql.Date) getValue(index, JDBCType.DATE);
@@ -718,6 +741,7 @@ public Date getDate(String parameterName) throws SQLServerException {
718741

719742
@Override
720743
public Date getDate(int index, Calendar cal) throws SQLServerException {
744+
setByIndex();
721745
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
722746
loggerExternal.entering(getClassNameLogging(), "getDate", new Object[] {index, cal});
723747
checkClosed();
@@ -739,6 +763,7 @@ public Date getDate(String parameterName, Calendar cal) throws SQLServerExceptio
739763

740764
@Override
741765
public double getDouble(int index) throws SQLServerException {
766+
setByIndex();
742767
loggerExternal.entering(getClassNameLogging(), "getDouble", index);
743768
checkClosed();
744769
Double value = (Double) getValue(index, JDBCType.DOUBLE);
@@ -758,6 +783,7 @@ public double getDouble(String parameterName) throws SQLServerException {
758783

759784
@Override
760785
public float getFloat(int index) throws SQLServerException {
786+
setByIndex();
761787
loggerExternal.entering(getClassNameLogging(), "getFloat", index);
762788
checkClosed();
763789
Float value = (Float) getValue(index, JDBCType.REAL);
@@ -777,7 +803,7 @@ public float getFloat(String parameterName) throws SQLServerException {
777803

778804
@Override
779805
public long getLong(int index) throws SQLServerException {
780-
806+
setByIndex();
781807
loggerExternal.entering(getClassNameLogging(), "getLong", index);
782808
checkClosed();
783809
Long value = (Long) getValue(index, JDBCType.BIGINT);
@@ -797,7 +823,7 @@ public long getLong(String parameterName) throws SQLServerException {
797823

798824
@Override
799825
public Object getObject(int index) throws SQLServerException {
800-
826+
setByIndex();
801827
loggerExternal.entering(getClassNameLogging(), "getObject", index);
802828
checkClosed();
803829
Object value = getValue(index,
@@ -809,6 +835,7 @@ public Object getObject(int index) throws SQLServerException {
809835

810836
@Override
811837
public <T> T getObject(int index, Class<T> type) throws SQLException {
838+
setByIndex();
812839
loggerExternal.entering(getClassNameLogging(), "getObject", index);
813840
checkClosed();
814841
Object returnValue;
@@ -923,6 +950,7 @@ public <T> T getObject(String parameterName, Class<T> type) throws SQLException
923950

924951
@Override
925952
public short getShort(int index) throws SQLServerException {
953+
setByIndex();
926954
loggerExternal.entering(getClassNameLogging(), "getShort", index);
927955
checkClosed();
928956
Short value = (Short) getValue(index, JDBCType.SMALLINT);
@@ -942,7 +970,7 @@ public short getShort(String parameterName) throws SQLServerException {
942970

943971
@Override
944972
public Time getTime(int index) throws SQLServerException {
945-
973+
setByIndex();
946974
loggerExternal.entering(getClassNameLogging(), "getTime", index);
947975
checkClosed();
948976
java.sql.Time value = (java.sql.Time) getValue(index, JDBCType.TIME);
@@ -962,6 +990,7 @@ public Time getTime(String parameterName) throws SQLServerException {
962990

963991
@Override
964992
public Time getTime(int index, Calendar cal) throws SQLServerException {
993+
setByIndex();
965994
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
966995
loggerExternal.entering(getClassNameLogging(), "getTime", new Object[] {index, cal});
967996
checkClosed();
@@ -983,6 +1012,7 @@ public Time getTime(String parameterName, Calendar cal) throws SQLServerExceptio
9831012

9841013
@Override
9851014
public Timestamp getTimestamp(int index) throws SQLServerException {
1015+
setByIndex();
9861016
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
9871017
loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, index);
9881018
checkClosed();
@@ -1003,6 +1033,7 @@ public Timestamp getTimestamp(String parameterName) throws SQLServerException {
10031033

10041034
@Override
10051035
public Timestamp getTimestamp(int index, Calendar cal) throws SQLServerException {
1036+
setByIndex();
10061037
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
10071038
loggerExternal.entering(getClassNameLogging(), GET_TIMESTAMP, new Object[] {index, cal});
10081039
checkClosed();
@@ -1024,6 +1055,7 @@ public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLServ
10241055
}
10251056

10261057
LocalDateTime getLocalDateTime(int columnIndex) throws SQLServerException {
1058+
setByIndex();
10271059
loggerExternal.entering(getClassNameLogging(), "getLocalDateTime", columnIndex);
10281060
checkClosed();
10291061
LocalDateTime value = (LocalDateTime) getValue(columnIndex, JDBCType.LOCALDATETIME);
@@ -1033,6 +1065,7 @@ LocalDateTime getLocalDateTime(int columnIndex) throws SQLServerException {
10331065

10341066
@Override
10351067
public Timestamp getDateTime(int index) throws SQLServerException {
1068+
setByIndex();
10361069
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
10371070
loggerExternal.entering(getClassNameLogging(), "getDateTime", index);
10381071
checkClosed();
@@ -1053,6 +1086,7 @@ public Timestamp getDateTime(String parameterName) throws SQLServerException {
10531086

10541087
@Override
10551088
public Timestamp getDateTime(int index, Calendar cal) throws SQLServerException {
1089+
setByIndex();
10561090
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
10571091
loggerExternal.entering(getClassNameLogging(), "getDateTime", new Object[] {index, cal});
10581092
checkClosed();
@@ -1075,6 +1109,7 @@ public Timestamp getDateTime(String parameterName, Calendar cal) throws SQLServe
10751109

10761110
@Override
10771111
public Timestamp getSmallDateTime(int index) throws SQLServerException {
1112+
setByIndex();
10781113
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
10791114
loggerExternal.entering(getClassNameLogging(), "getSmallDateTime", index);
10801115
checkClosed();
@@ -1096,6 +1131,7 @@ public Timestamp getSmallDateTime(String parameterName) throws SQLServerExceptio
10961131

10971132
@Override
10981133
public Timestamp getSmallDateTime(int index, Calendar cal) throws SQLServerException {
1134+
setByIndex();
10991135
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
11001136
loggerExternal.entering(getClassNameLogging(), "getSmallDateTime", new Object[] {index, cal});
11011137
checkClosed();
@@ -1118,6 +1154,7 @@ public Timestamp getSmallDateTime(String parameterName, Calendar cal) throws SQL
11181154

11191155
@Override
11201156
public microsoft.sql.DateTimeOffset getDateTimeOffset(int index) throws SQLServerException {
1157+
setByIndex();
11211158
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
11221159
loggerExternal.entering(getClassNameLogging(), "getDateTimeOffset", index);
11231160
checkClosed();
@@ -1163,6 +1200,7 @@ public boolean wasNull() throws SQLServerException {
11631200

11641201
@Override
11651202
public final java.io.InputStream getAsciiStream(int parameterIndex) throws SQLServerException {
1203+
setByIndex();
11661204
loggerExternal.entering(getClassNameLogging(), "getAsciiStream", parameterIndex);
11671205
checkClosed();
11681206
InputStream value = (InputStream) getStream(parameterIndex, StreamType.ASCII);
@@ -1182,6 +1220,7 @@ public final java.io.InputStream getAsciiStream(String parameterName) throws SQL
11821220

11831221
@Override
11841222
public BigDecimal getBigDecimal(int parameterIndex) throws SQLServerException {
1223+
setByIndex();
11851224
loggerExternal.entering(getClassNameLogging(), "getBigDecimal", parameterIndex);
11861225
checkClosed();
11871226
BigDecimal value = (BigDecimal) getValue(parameterIndex, JDBCType.DECIMAL);
@@ -1201,6 +1240,7 @@ public BigDecimal getBigDecimal(String parameterName) throws SQLServerException
12011240

12021241
@Override
12031242
public BigDecimal getMoney(int parameterIndex) throws SQLServerException {
1243+
setByIndex();
12041244
loggerExternal.entering(getClassNameLogging(), "getMoney", parameterIndex);
12051245
checkClosed();
12061246
BigDecimal value = (BigDecimal) getValue(parameterIndex, JDBCType.MONEY);
@@ -1220,6 +1260,7 @@ public BigDecimal getMoney(String parameterName) throws SQLServerException {
12201260

12211261
@Override
12221262
public BigDecimal getSmallMoney(int parameterIndex) throws SQLServerException {
1263+
setByIndex();
12231264
loggerExternal.entering(getClassNameLogging(), "getSmallMoney", parameterIndex);
12241265
checkClosed();
12251266
BigDecimal value = (BigDecimal) getValue(parameterIndex, JDBCType.SMALLMONEY);
@@ -1239,6 +1280,7 @@ public BigDecimal getSmallMoney(String parameterName) throws SQLServerException
12391280

12401281
@Override
12411282
public final java.io.InputStream getBinaryStream(int parameterIndex) throws SQLServerException {
1283+
setByIndex();
12421284
loggerExternal.entering(getClassNameLogging(), "getBinaryStream", parameterIndex);
12431285
checkClosed();
12441286
InputStream value = (InputStream) getStream(parameterIndex, StreamType.BINARY);
@@ -1258,6 +1300,7 @@ public final java.io.InputStream getBinaryStream(String parameterName) throws SQ
12581300

12591301
@Override
12601302
public Blob getBlob(int parameterIndex) throws SQLServerException {
1303+
setByIndex();
12611304
loggerExternal.entering(getClassNameLogging(), "getBlob", parameterIndex);
12621305
checkClosed();
12631306
Blob value = (Blob) getValue(parameterIndex, JDBCType.BLOB);
@@ -1277,6 +1320,7 @@ public Blob getBlob(String parameterName) throws SQLServerException {
12771320

12781321
@Override
12791322
public final java.io.Reader getCharacterStream(int parameterIndex) throws SQLServerException {
1323+
setByIndex();
12801324
loggerExternal.entering(getClassNameLogging(), "getCharacterStream", parameterIndex);
12811325
checkClosed();
12821326
Reader reader = (Reader) getStream(parameterIndex, StreamType.CHARACTER);
@@ -1296,6 +1340,7 @@ public final java.io.Reader getCharacterStream(String parameterName) throws SQLE
12961340

12971341
@Override
12981342
public final java.io.Reader getNCharacterStream(int parameterIndex) throws SQLException {
1343+
setByIndex();
12991344
loggerExternal.entering(getClassNameLogging(), "getNCharacterStream", parameterIndex);
13001345
checkClosed();
13011346
Reader reader = (Reader) getStream(parameterIndex, StreamType.NCHARACTER);
@@ -1327,6 +1372,7 @@ void closeActiveStream() throws SQLServerException {
13271372

13281373
@Override
13291374
public Clob getClob(int parameterIndex) throws SQLServerException {
1375+
setByIndex();
13301376
loggerExternal.entering(getClassNameLogging(), "getClob", parameterIndex);
13311377
checkClosed();
13321378
Clob clob = (Clob) getValue(parameterIndex, JDBCType.CLOB);
@@ -1346,6 +1392,7 @@ public Clob getClob(String parameterName) throws SQLServerException {
13461392

13471393
@Override
13481394
public NClob getNClob(int parameterIndex) throws SQLException {
1395+
setByIndex();
13491396
loggerExternal.entering(getClassNameLogging(), "getNClob", parameterIndex);
13501397
checkClosed();
13511398
NClob nClob = (NClob) getValue(parameterIndex, JDBCType.NCLOB);
@@ -2455,6 +2502,7 @@ public final void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLEx
24552502

24562503
@Override
24572504
public final SQLXML getSQLXML(int parameterIndex) throws SQLException {
2505+
setByIndex();
24582506
loggerExternal.entering(getClassNameLogging(), "getSQLXML", parameterIndex);
24592507
checkClosed();
24602508
SQLServerSQLXML value = (SQLServerSQLXML) getSQLXMLInternal(parameterIndex);
@@ -2495,8 +2543,11 @@ public void registerOutParameter(String parameterName, int sqlType, String typeN
24952543
loggerExternal.entering(getClassNameLogging(), "registerOutParameter",
24962544
new Object[] {parameterName, sqlType, typeName});
24972545
checkClosed();
2498-
registerOutParameter(findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD), sqlType,
2499-
typeName);
2546+
2547+
int index = findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD);
2548+
2549+
registerOutParameterByName(index, sqlType);
2550+
25002551
loggerExternal.exiting(getClassNameLogging(), "registerOutParameter");
25012552
}
25022553

@@ -2506,8 +2557,12 @@ public void registerOutParameter(String parameterName, int sqlType, int scale) t
25062557
loggerExternal.entering(getClassNameLogging(), "registerOutParameter",
25072558
new Object[] {parameterName, sqlType, scale});
25082559
checkClosed();
2509-
registerOutParameter(findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD), sqlType,
2510-
scale);
2560+
2561+
int index = findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD);
2562+
2563+
registerOutParameterByName(index, sqlType);
2564+
inOutParam[index - 1].setOutScale(scale);
2565+
25112566
loggerExternal.exiting(getClassNameLogging(), "registerOutParameter");
25122567
}
25132568

@@ -2516,10 +2571,15 @@ public void registerOutParameter(String parameterName, int sqlType, int precisio
25162571
int scale) throws SQLServerException {
25172572
if (loggerExternal.isLoggable(java.util.logging.Level.FINER))
25182573
loggerExternal.entering(getClassNameLogging(), "registerOutParameter",
2519-
new Object[] {parameterName, sqlType, scale});
2574+
new Object[] {parameterName, sqlType, scale, precision});
25202575
checkClosed();
2521-
registerOutParameter(findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD), sqlType,
2522-
precision, scale);
2576+
2577+
int index = findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD);
2578+
2579+
registerOutParameterByName(index, sqlType);
2580+
inOutParam[index - 1].setValueLength(precision);
2581+
inOutParam[index - 1].setOutScale(scale);
2582+
25232583
loggerExternal.exiting(getClassNameLogging(), "registerOutParameter");
25242584
}
25252585

@@ -2529,7 +2589,7 @@ public void registerOutParameter(String parameterName, int sqlType) throws SQLSe
25292589
loggerExternal.entering(getClassNameLogging(), "registerOutParameter",
25302590
new Object[] {parameterName, sqlType});
25312591
checkClosed();
2532-
registerOutParameter(findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD), sqlType);
2592+
registerOutParameterByName(findColumn(parameterName, CallableStatementGetterSetterMethod.IS_SETTER_METHOD), sqlType);
25332593
loggerExternal.exiting(getClassNameLogging(), "registerOutParameter");
25342594
}
25352595

0 commit comments

Comments
 (0)