Skip to content

Commit f9d839f

Browse files
committed
[oracle] Fix handling of date/time types
Also add test for Oracle default values On behalf of Faunalia, sponsored by ENEL
1 parent 612043c commit f9d839f

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

src/providers/oracle/qgsoracleprovider.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ QgsOracleProvider::QgsOracleProvider( QString const & uri )
159159
<< QgsVectorDataProvider::NativeType( tr( "Text, fixed length (char)" ), "CHAR", QVariant::String, 1, 255 )
160160
<< QgsVectorDataProvider::NativeType( tr( "Text, limited variable length (varchar2)" ), "VARCHAR2", QVariant::String, 1, 255 )
161161
<< QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (long)" ), "LONG", QVariant::String )
162+
163+
// date type
164+
<< QgsVectorDataProvider::NativeType( tr( "Date" ), "DATE", QVariant::Date, 38, 38, 0, 0 )
165+
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), "TIMESTAMP(6)", QVariant::DateTime, 38, 38, 6, 6 )
162166
;
163167

164168
QString key;
@@ -741,7 +745,15 @@ bool QgsOracleProvider::loadFields()
741745
if ( !mIsQuery && !types.contains( field.name() ) )
742746
continue;
743747

744-
mAttributeFields.append( QgsField( field.name(), field.type(), types.value( field.name() ), field.length(), field.precision(), comments.value( field.name() ) ) );
748+
QVariant::Type type = field.type();
749+
750+
if ( types.value( field.name() ) == "DATE" )
751+
{
752+
// date types are incorrectly detected as datetime
753+
type = QVariant::Date;
754+
}
755+
756+
mAttributeFields.append( QgsField( field.name(), type, types.value( field.name() ), field.length(), field.precision(), comments.value( field.name() ) ) );
745757
mDefaultValues.append( defvalues.value( field.name(), QVariant() ) );
746758
}
747759

@@ -2522,6 +2534,11 @@ bool QgsOracleProvider::convertField( QgsField &field )
25222534
break;
25232535

25242536
case QVariant::DateTime:
2537+
fieldType = "TIMESTAMP";
2538+
fieldPrec = -1;
2539+
break;
2540+
2541+
25252542
case QVariant::Time:
25262543
case QVariant::String:
25272544
fieldType = "VARCHAR2(2047)";

tests/src/python/test_provider_oracle.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import os
1818

19-
from qgis.core import QgsVectorLayer, QgsFeatureRequest
19+
from qgis.core import QgsVectorLayer, QgsFeatureRequest, NULL
2020

2121
from qgis.PyQt.QtCore import QSettings, QDate, QTime, QDateTime, QVariant
2222

@@ -77,5 +77,31 @@ def uncompiledFilters(self):
7777
'intersects($geometry,geom_from_wkt( \'Polygon ((-72.2 66.1, -65.2 66.1, -65.2 72.0, -72.2 72.0, -72.2 66.1))\'))'])
7878
return filters
7979

80+
# HERE GO THE PROVIDER SPECIFIC TESTS
81+
def testDateTimeTypes(self):
82+
vl = QgsVectorLayer('%s table="QGIS"."DATE_TIMES" sql=' %
83+
(self.dbconn), "testdatetimes", "oracle")
84+
self.assertTrue(vl.isValid())
85+
86+
fields = vl.dataProvider().fields()
87+
self.assertEqual(fields.at(fields.indexFromName(
88+
'date_field')).type(), QVariant.Date)
89+
self.assertEqual(fields.at(fields.indexFromName(
90+
'datetime_field')).type(), QVariant.DateTime)
91+
92+
f = next(vl.getFeatures(QgsFeatureRequest()))
93+
94+
date_idx = vl.fieldNameIndex('date_field')
95+
self.assertTrue(isinstance(f.attributes()[date_idx], QDate))
96+
self.assertEqual(f.attributes()[date_idx], QDate(2004, 3, 4))
97+
datetime_idx = vl.fieldNameIndex('datetime_field')
98+
self.assertTrue(isinstance(f.attributes()[datetime_idx], QDateTime))
99+
self.assertEqual(f.attributes()[datetime_idx], QDateTime(
100+
QDate(2004, 3, 4), QTime(13, 41, 52)))
101+
102+
def testDefaultValue(self):
103+
self.assertEqual(self.provider.defaultValue(1), NULL)
104+
self.assertEqual(self.provider.defaultValue(2), "'qgis'")
105+
80106
if __name__ == '__main__':
81107
unittest.main()

tests/testdata/provider/testdata_oracle.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) VALU
2424

2525
CREATE INDEX some_poly_data_spatial_idx ON QGIS.SOME_POLY_DATA(GEOM) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
2626

27+
28+
CREATE TABLE QGIS.DATE_TIMES ( "id" INTEGER PRIMARY KEY, "date_field" DATE, "datetime_field" TIMESTAMP );
29+
30+
INSERT INTO QGIS.DATE_TIMES ("id", "date_field", "datetime_field" ) VALUES (1, DATE '2004-03-04', TIMESTAMP '2004-03-04 13:41:52' );
31+
32+
COMMIT;

0 commit comments

Comments
 (0)