Skip to content

Commit 74e8de3

Browse files
Bind NVARCHAR in TVP (#4517) (#4568)
Bind NVARCHAR in TVP - earlier we were parsing nvarchar in tvp as simple strings due to internal errors, but with maturity we are able to bind this type as well. Sign-off: Mohi Raj mrxmohit@amazon.com (cherry picked from commit 80d7d7e) Co-authored-by: Kushaal Shroff <51415286+KushaalShroff@users.noreply.github.com>
1 parent f62a947 commit 74e8de3

File tree

2 files changed

+20
-46
lines changed

2 files changed

+20
-46
lines changed

contrib/babelfishpg_tds/src/backend/tds/tdstypeio.c

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,7 +2256,6 @@ TdsRecvTypeTable(const char *message, const ParameterToken token)
22562256
Datum *values = palloc(nargs * sizeof(Datum));
22572257
char *nulls = palloc(nargs * sizeof(char));
22582258
Oid *argtypes = palloc(nargs * sizeof(Datum));
2259-
int i = 0;
22602259

22612260
query = " ";
22622261

@@ -2275,76 +2274,67 @@ TdsRecvTypeTable(const char *message, const ParameterToken token)
22752274
{
22762275
temp = &(row->columnValues[currentColumn]);
22772276
tempFuncInfo = TdsLookupTypeFunctionsByTdsId(colMetaData[currentColumn].columnTdsType, colMetaData[currentColumn].maxLen);
2278-
GetPgOid(argtypes[i], tempFuncInfo);
2277+
GetPgOid(argtypes[currentColumn], tempFuncInfo);
22792278
if (row->isNull[currentColumn] == 'n')
2280-
nulls[i] = row->isNull[currentColumn];
2279+
nulls[currentColumn] = row->isNull[currentColumn];
22812280
else
22822281
switch (colMetaData[currentColumn].columnTdsType)
22832282
{
22842283
case TDS_TYPE_CHAR:
22852284
case TDS_TYPE_VARCHAR:
2286-
values[i] = TdsTypeVarcharToDatum(temp, colMetaData[currentColumn].encoding, colMetaData[currentColumn].columnTdsType);
2285+
values[currentColumn] = TdsTypeVarcharToDatum(temp, colMetaData[currentColumn].encoding, colMetaData[currentColumn].columnTdsType);
22872286
break;
22882287
case TDS_TYPE_NCHAR:
2289-
values[i] = TdsTypeNCharToDatum(temp);
2290-
break;
22912288
case TDS_TYPE_NVARCHAR:
2292-
if (!row->isNull[currentColumn]) /* NULL. */
2293-
currentQuery = psprintf("%s,\'NULL\'", currentQuery);
2294-
else
2295-
currentQuery = psprintf("%s,\'%s\'", currentQuery, temp->data);
2296-
nargs--;
2289+
values[currentColumn] = TdsTypeNCharToDatum(temp);
22972290
break;
22982291
case TDS_TYPE_INTEGER:
22992292
case TDS_TYPE_BIT:
2300-
values[i] = TdsTypeIntegerToDatum(temp, colMetaData[currentColumn].maxLen);
2293+
values[currentColumn] = TdsTypeIntegerToDatum(temp, colMetaData[currentColumn].maxLen);
23012294
break;
23022295
case TDS_TYPE_FLOAT:
2303-
values[i] = TdsTypeFloatToDatum(temp, colMetaData[currentColumn].maxLen);
2296+
values[currentColumn] = TdsTypeFloatToDatum(temp, colMetaData[currentColumn].maxLen);
23042297
break;
23052298
case TDS_TYPE_NUMERICN:
23062299
case TDS_TYPE_DECIMALN:
2307-
values[i] = TdsTypeNumericToDatum(temp, colMetaData[currentColumn].scale);
2300+
values[currentColumn] = TdsTypeNumericToDatum(temp, colMetaData[currentColumn].scale);
23082301
break;
23092302
case TDS_TYPE_VARBINARY:
23102303
case TDS_TYPE_BINARY:
2311-
values[i] = TdsTypeVarbinaryToDatum(temp);
2312-
argtypes[i] = tempFuncInfo->ttmtypeid;
2304+
values[currentColumn] = TdsTypeVarbinaryToDatum(temp);
2305+
argtypes[currentColumn] = tempFuncInfo->ttmtypeid;
23132306
break;
23142307
case TDS_TYPE_DATE:
2315-
values[i] = TdsTypeDateToDatum(temp);
2308+
values[currentColumn] = TdsTypeDateToDatum(temp);
23162309
break;
23172310
case TDS_TYPE_TIME:
2318-
values[i] = TdsTypeTimeToDatum(temp, colMetaData[currentColumn].scale, temp->len);
2311+
values[currentColumn] = TdsTypeTimeToDatum(temp, colMetaData[currentColumn].scale, temp->len);
23192312
break;
23202313
case TDS_TYPE_DATETIMEOFFSET:
2321-
values[i] = TdsTypeDatetimeoffsetToDatum(temp, colMetaData[currentColumn].scale, temp->len);
2314+
values[currentColumn] = TdsTypeDatetimeoffsetToDatum(temp, colMetaData[currentColumn].scale, temp->len);
23222315
break;
23232316
case TDS_TYPE_DATETIME2:
2324-
values[i] = TdsTypeDatetime2ToDatum(temp, colMetaData[currentColumn].scale, temp->len);
2317+
values[currentColumn] = TdsTypeDatetime2ToDatum(temp, colMetaData[currentColumn].scale, temp->len);
23252318
break;
23262319
case TDS_TYPE_DATETIMEN:
2327-
values[i] = TdsTypeDatetimeToDatum(temp);
2320+
values[currentColumn] = TdsTypeDatetimeToDatum(temp);
23282321
break;
23292322
case TDS_TYPE_MONEYN:
2330-
values[i] = TdsTypeMoneyToDatum(temp);
2323+
values[currentColumn] = TdsTypeMoneyToDatum(temp);
23312324
break;
23322325
case TDS_TYPE_XML:
2333-
values[i] = TdsTypeXMLToDatum(temp);
2326+
values[currentColumn] = TdsTypeXMLToDatum(temp);
23342327
break;
23352328
case TDS_TYPE_UNIQUEIDENTIFIER:
2336-
values[i] = TdsTypeUIDToDatum(temp);
2329+
values[currentColumn] = TdsTypeUIDToDatum(temp);
23372330
break;
23382331
case TDS_TYPE_SQLVARIANT:
2339-
values[i] = TdsTypeSqlVariantToDatum(temp);
2332+
values[currentColumn] = TdsTypeSqlVariantToDatum(temp);
23402333
break;
23412334
}
23422335
/* Build a string for bind parameters. */
2343-
if (colMetaData[currentColumn].columnTdsType != TDS_TYPE_NVARCHAR || row->isNull[currentColumn] == 'n')
2344-
{
2345-
currentQuery = psprintf("%s,$%d", currentQuery, i + 1);
2346-
i++;
2347-
}
2336+
currentQuery = psprintf("%s,$%d", currentQuery, currentColumn + 1);
2337+
nulls[currentColumn] = row->isNull[currentColumn];
23482338
currentColumn++;
23492339
}
23502340
row = row->nextRow;

contrib/babelfishpg_tds/src/include/tds_request.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -388,14 +388,6 @@ SetTvpRowData(ParameterToken temp, const StringInfo message, uint64_t *offset)
388388
memcpy(value, &messageData[*offset], rowData->columnValues[i].len);
389389
rowData->columnValues[i].data = value;
390390
*offset += rowData->columnValues[i].len;
391-
if (colmetadata[i].columnTdsType == TDS_TYPE_NVARCHAR)
392-
{
393-
StringInfo tempStringInfo = palloc(sizeof(StringInfoData));
394-
395-
initStringInfo(tempStringInfo);
396-
TdsUTF16toUTF8StringInfo(tempStringInfo, value, rowData->columnValues[i].len);
397-
rowData->columnValues[i] = *tempStringInfo;
398-
}
399391
}
400392
else
401393
{
@@ -413,14 +405,6 @@ SetTvpRowData(ParameterToken temp, const StringInfo message, uint64_t *offset)
413405
rowData->isNull[i] = 'n';
414406
}
415407
rowData->columnValues[i] = *(TdsGetPlpStringInfoBufferFromToken(messageData, temp));
416-
if (colmetadata[i].columnTdsType == TDS_TYPE_NVARCHAR)
417-
{
418-
StringInfo tempStringInfo = palloc(sizeof(StringInfoData));
419-
420-
initStringInfo(tempStringInfo);
421-
TdsUTF16toUTF8StringInfo(tempStringInfo, rowData->columnValues[i].data, rowData->columnValues[i].len);
422-
rowData->columnValues[i] = *tempStringInfo;
423-
}
424408
temp->isNull = false;
425409
}
426410
}

0 commit comments

Comments
 (0)