Skip to content

PostgreSQL and TEXT column type #3041

@lrec313

Description

@lrec313

I have found a bug when using a column data type of "TEXT" in a PostgreSQL database.

In function oidToColumnDataType() of file Data/PostgreSQL/src/PostgreSQLTypes.cpp, columns of type "TEXT" (TEXTOID) are assigned to type MetaColumn::FDT_CLOB. But that column type is not handled in functions RecordSet::value() and StatementImpl::makeExtractors()

There are two solutions:
1- Assign type MetaColumn::FDT_STRING to TEXTOID columns:

diff --git a/Data/PostgreSQL/src/PostgreSQLTypes.cpp b/Data/PostgreSQL/src/PostgreSQLTypes.cpp
index 743e729..d5494b7 100644
--- a/Data/PostgreSQL/src/PostgreSQLTypes.cpp
+++ b/Data/PostgreSQL/src/PostgreSQLTypes.cpp
@@ -70,7 +70,7 @@ Poco::Data::MetaColumn::ColumnDataType oidToColumnDataType(const Oid anOID)
 		cdt = Poco::Data::MetaColumn::FDT_BLOB;
 		break;
 	case TEXTOID:
-		cdt = Poco::Data::MetaColumn::FDT_CLOB;
+		cdt = Poco::Data::MetaColumn::FDT_STRING;
 		break;
 
 	// date

2- Add support for MetaColumn::FDT_CLOB column data type:

diff --git a/Data/src/RecordSet.cpp b/Data/src/RecordSet.cpp
index d0028f3..1a6ae67 100644
--- a/Data/src/RecordSet.cpp
+++ b/Data/src/RecordSet.cpp
@@ -188,6 +188,7 @@ Poco::Dynamic::Var RecordSet::value(const std::string& name, std::size_t row, bo
 	case MetaColumn::FDT_STRING:    return value<std::string>(name, row, useFilter);
 	case MetaColumn::FDT_WSTRING:   return value<UTF16String>(name, row, useFilter);
 	case MetaColumn::FDT_BLOB:      return value<BLOB>(name, row, useFilter);
+	case MetaColumn::FDT_CLOB:      return value<CLOB>(name, row, useFilter);
 	case MetaColumn::FDT_DATE:      return value<Date>(name, row, useFilter);
 	case MetaColumn::FDT_TIME:      return value<Time>(name, row, useFilter);
 	case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(name, row, useFilter);
diff --git a/Data/src/StatementImpl.cpp b/Data/src/StatementImpl.cpp
index 43d2c36..8735de2 100644
--- a/Data/src/StatementImpl.cpp
+++ b/Data/src/StatementImpl.cpp
@@ -343,6 +343,8 @@ void StatementImpl::makeExtractors(std::size_t count)
 				addInternalExtract<Poco::UTF16String>(mc); break;
 			case MetaColumn::FDT_BLOB:   
 				addInternalExtract<BLOB>(mc); break;
+			case MetaColumn::FDT_CLOB:
+				addInternalExtract<CLOB>(mc); break;
 			case MetaColumn::FDT_DATE:
 				addInternalExtract<Date>(mc); break;
 			case MetaColumn::FDT_TIME:

Best regards

Luis Recuerda

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions