Skip to content

Commit 5387b1b

Browse files
committed
SNOW-831854: Add error handling logic (#1630)
1 parent 83912a6 commit 5387b1b

File tree

6 files changed

+252
-188
lines changed

6 files changed

+252
-188
lines changed

src/snowflake/connector/cpp/ArrowIterator/CArrowChunkIterator.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ std::shared_ptr<ReturnVal> CArrowChunkIterator::next()
6464
}
6565
else
6666
{
67+
SF_CHECK_PYTHON_ERR();
6768
m_currentBatchIndex++;
6869
if (m_currentBatchIndex < m_batchCount)
6970
{
@@ -113,20 +114,15 @@ void CArrowChunkIterator::initColumnConverters()
113114

114115
returnCode = ArrowSchemaViewInit(
115116
&columnSchemaView, columnSchema, &error);
116-
if (returnCode != NANOARROW_OK) {
117-
std::string errorInfo = Logger::formatString(
118-
"[Snowflake Exception] error initializing ArrowSchemaView : %s",
119-
ArrowErrorMessage(&error)
120-
);
121-
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str());
122-
PyErr_SetString(PyExc_Exception, errorInfo.c_str());
123-
}
117+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error initializing ArrowSchemaView: %s, error code: %d", ArrowErrorMessage(&error), returnCode);
124118

125119
ArrowArrayView* array = m_ipcArrowArrayViewVec[m_currentBatchIndex]->children[i];
126120

127121
ArrowStringView snowflakeLogicalType;
128122
const char* metadata = m_ipcArrowSchema->children[i]->metadata;
129-
ArrowMetadataGetValue(metadata, ArrowCharView("logicalType"), &snowflakeLogicalType);
123+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("logicalType"), &snowflakeLogicalType);
124+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'logicalType' from Arrow metadata, error code: %d", returnCode);
125+
130126
SnowflakeType::Type st = SnowflakeType::snowflakeTypeFromString(
131127
std::string(snowflakeLogicalType.data, snowflakeLogicalType.size_bytes)
132128
);
@@ -140,8 +136,10 @@ void CArrowChunkIterator::initColumnConverters()
140136
int scale = 0;
141137
int precision = 38;
142138
if(metadata != nullptr) {
143-
ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
144-
ArrowMetadataGetValue(metadata, ArrowCharView("precision"), &precisionString);
139+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
140+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'scale' from Arrow metadata, error code: %d", returnCode);
141+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("precision"), &precisionString);
142+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'precision' from Arrow metadata, error code: %d", returnCode);
145143
scale = std::stoi(scaleString.data);
146144
precision = std::stoi(precisionString.data);
147145
}
@@ -274,7 +272,8 @@ void CArrowChunkIterator::initColumnConverters()
274272
int scale = 9;
275273
if(metadata != nullptr) {
276274
ArrowStringView scaleString;
277-
ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
275+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
276+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'scale' from Arrow metadata, error code: %d", returnCode);
278277
scale = std::stoi(scaleString.data);
279278
}
280279
switch (columnSchemaView.type)
@@ -307,7 +306,8 @@ void CArrowChunkIterator::initColumnConverters()
307306
int scale = 9;
308307
if(metadata != nullptr) {
309308
ArrowStringView scaleString;
310-
ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
309+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
310+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'scale' from Arrow metadata, error code: %d", returnCode);
311311
scale = std::stoi(scaleString.data);
312312
}
313313
switch (columnSchemaView.type)
@@ -365,7 +365,8 @@ void CArrowChunkIterator::initColumnConverters()
365365
int scale = 9;
366366
if(metadata != nullptr) {
367367
ArrowStringView scaleString;
368-
ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
368+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
369+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'scale' from Arrow metadata, error code: %d", returnCode);
369370
scale = std::stoi(scaleString.data);
370371
}
371372
switch (columnSchemaView.type)
@@ -407,8 +408,10 @@ void CArrowChunkIterator::initColumnConverters()
407408
int scale = 9;
408409
int byteLength = 16;
409410
if(metadata != nullptr) {
410-
ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
411-
ArrowMetadataGetValue(metadata, ArrowCharView("byteLength"), &byteLengthString);
411+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("scale"), &scaleString);
412+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'scale' from Arrow metadata, error code: %d", returnCode);
413+
returnCode = ArrowMetadataGetValue(metadata, ArrowCharView("byteLength"), &byteLengthString);
414+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error getting 'byteLength' from Arrow metadata, error code: %d", returnCode);
412415
scale = std::stoi(scaleString.data);
413416
byteLength = std::stoi(byteLengthString.data);
414417
}

src/snowflake/connector/cpp/ArrowIterator/CArrowIterator.cpp

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@ Logger* CArrowIterator::logger = new Logger("snowflake.connector.CArrowIterator"
1414

1515
CArrowIterator::CArrowIterator(char* arrow_bytes, int64_t arrow_bytes_size)
1616
{
17-
17+
int returnCode = 0;
1818
ArrowBuffer input_buffer;
1919
ArrowBufferInit(&input_buffer);
20-
ArrowBufferAppend(&input_buffer, arrow_bytes, arrow_bytes_size);
20+
returnCode = ArrowBufferAppend(&input_buffer, arrow_bytes, arrow_bytes_size);
21+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error loading arrow bytes, error code: %d", returnCode);
2122
ArrowIpcInputStream input;
22-
ArrowIpcInputStreamInitBuffer(&input, &input_buffer);
23+
returnCode = ArrowIpcInputStreamInitBuffer(&input, &input_buffer);
24+
SF_CHECK_ARROW_RC(returnCode, "[Snowflake Exception] error initializing ArrowIpcInputStream, error code: %d", returnCode);
2325
ArrowArrayStream stream;
24-
ArrowIpcArrayStreamReaderInit(&stream, &input, nullptr);
25-
stream.get_schema(&stream, m_ipcArrowSchema.get());
26+
returnCode = ArrowIpcArrayStreamReaderInit(&stream, &input, nullptr);
27+
SF_CHECK_ARROW_RC_AND_RELEASE_ARROW_STREAM(returnCode, stream, "[Snowflake Exception] error initializing ArrowIpcArrayStreamReader, error code: %d", returnCode);
28+
returnCode = stream.get_schema(&stream, m_ipcArrowSchema.get());
29+
SF_CHECK_ARROW_RC_AND_RELEASE_ARROW_STREAM(returnCode, stream, "[Snowflake Exception] error getting schema from stream, error code: %d", returnCode);
2630

2731
while(true) {
2832
nanoarrow::UniqueArray newUniqueArray;
@@ -32,27 +36,13 @@ CArrowIterator::CArrowIterator(char* arrow_bytes, int64_t arrow_bytes_size)
3236
m_ipcArrowArrayVec.push_back(std::move(newUniqueArray));
3337

3438
ArrowError error;
35-
int returnCode = ArrowArrayViewInitFromSchema(
39+
returnCode = ArrowArrayViewInitFromSchema(
3640
newUniqueArrayView.get(), m_ipcArrowSchema.get(), &error);
37-
if (returnCode != NANOARROW_OK) {
38-
std::string errorInfo = Logger::formatString(
39-
"[Snowflake Exception] error initializing ArrowArrayView from schema : %s",
40-
ArrowErrorMessage(&error)
41-
);
42-
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str());
43-
PyErr_SetString(PyExc_Exception, errorInfo.c_str());
44-
}
41+
SF_CHECK_ARROW_RC_AND_RELEASE_ARROW_STREAM(returnCode, stream, "[Snowflake Exception] error initializing ArrowArrayView from schema : %s, error code: %d", ArrowErrorMessage(&error), returnCode);
4542

4643
returnCode = ArrowArrayViewSetArray(
4744
newUniqueArrayView.get(), newUniqueArray.get(), &error);
48-
if (returnCode != NANOARROW_OK) {
49-
std::string errorInfo = Logger::formatString(
50-
"[Snowflake Exception] error setting ArrowArrayView from array : %s",
51-
ArrowErrorMessage(&error)
52-
);
53-
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str());
54-
PyErr_SetString(PyExc_Exception, errorInfo.c_str());
55-
}
45+
SF_CHECK_ARROW_RC_AND_RELEASE_ARROW_STREAM(returnCode, stream, "[Snowflake Exception] error setting ArrowArrayView from array : %s, error code: %d", ArrowErrorMessage(&error), returnCode);
5646
m_ipcArrowArrayViewVec.push_back(std::move(newUniqueArrayView));
5747
} else {
5848
break;

src/snowflake/connector/cpp/ArrowIterator/CArrowIterator.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,8 @@ static const char* NANOARROW_TYPE_ENUM_STRING[] = {
5656
"NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO"
5757
};
5858

59-
6059
#define SF_CHECK_ARROW_RC(arrow_status, format_string, ...) \
61-
if (!arrow_status.ok()) \
60+
if (arrow_status != NANOARROW_OK) \
6261
{ \
6362
std::string errorInfo = Logger::formatString(format_string, ##__VA_ARGS__); \
6463
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str()); \
@@ -67,14 +66,24 @@ static const char* NANOARROW_TYPE_ENUM_STRING[] = {
6766
}
6867

6968
#define SF_CHECK_ARROW_RC_AND_RETURN(arrow_status, ret_val, format_string, ...) \
70-
if (!arrow_status.ok()) \
69+
if (arrow_status != NANOARROW_OK) \
7170
{ \
7271
std::string errorInfo = Logger::formatString(format_string, ##__VA_ARGS__); \
7372
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str()); \
7473
PyErr_SetString(PyExc_Exception, errorInfo.c_str()); \
7574
return ret_val; \
7675
}
7776

77+
#define SF_CHECK_ARROW_RC_AND_RELEASE_ARROW_STREAM(arrow_status, stream, format_string, ...) \
78+
if (arrow_status != NANOARROW_OK) \
79+
{ \
80+
std::string errorInfo = Logger::formatString(format_string, ##__VA_ARGS__); \
81+
logger->error(__FILE__, __func__, __LINE__, errorInfo.c_str()); \
82+
PyErr_SetString(PyExc_Exception, errorInfo.c_str()); \
83+
stream.release(&stream); \
84+
return; \
85+
}
86+
7887
namespace sf
7988
{
8089

0 commit comments

Comments
 (0)