Skip to content

Commit f41cb6d

Browse files
committedJul 7, 2016
[oracle] Fix handling of date/time types
Also add test for Oracle default values On behalf of Faunalia, sponsored by ENEL (cherry-picked from f9d839f)
1 parent c2fe260 commit f41cb6d

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
@@ -158,6 +158,10 @@ QgsOracleProvider::QgsOracleProvider( QString const & uri )
158158
<< QgsVectorDataProvider::NativeType( tr( "Text, fixed length (char)" ), "CHAR", QVariant::String, 1, 255 )
159159
<< QgsVectorDataProvider::NativeType( tr( "Text, limited variable length (varchar2)" ), "VARCHAR2", QVariant::String, 1, 255 )
160160
<< QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (long)" ), "LONG", QVariant::String )
161+
162+
// date type
163+
<< QgsVectorDataProvider::NativeType( tr( "Date" ), "DATE", QVariant::Date, 38, 38, 0, 0 )
164+
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), "TIMESTAMP(6)", QVariant::DateTime, 38, 38, 6, 6 )
161165
;
162166

163167
QString key;
@@ -738,7 +742,15 @@ bool QgsOracleProvider::loadFields()
738742
if ( !mIsQuery && !types.contains( field.name() ) )
739743
continue;
740744

741-
mAttributeFields.append( QgsField( field.name(), field.type(), types.value( field.name() ), field.length(), field.precision(), comments.value( field.name() ) ) );
745+
QVariant::Type type = field.type();
746+
747+
if ( types.value( field.name() ) == "DATE" )
748+
{
749+
// date types are incorrectly detected as datetime
750+
type = QVariant::Date;
751+
}
752+
753+
mAttributeFields.append( QgsField( field.name(), type, types.value( field.name() ), field.length(), field.precision(), comments.value( field.name() ) ) );
742754
mDefaultValues.append( defvalues.value( field.name(), QVariant() ) );
743755
}
744756

@@ -2426,6 +2438,11 @@ bool QgsOracleProvider::convertField( QgsField &field )
24262438
break;
24272439

24282440
case QVariant::DateTime:
2441+
fieldType = "TIMESTAMP";
2442+
fieldPrec = -1;
2443+
break;
2444+
2445+
24292446
case QVariant::Time:
24302447
case QVariant::String:
24312448
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)
Please sign in to comment.