Skip to content

Commit a8ef995

Browse files
committed
Merge pull request #11663 from basilfx/sqlite-data-types
Sqlite data types
2 parents 039ea73 + ba3fc2b commit a8ef995

File tree

3 files changed

+189
-12
lines changed

3 files changed

+189
-12
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
- Added `Phalcon\Assets\Manager::exists()` to check if collection exists
6666
- `Phalcon\Mvc\Model\Manager::load()` now can load models from aliased namespaces
6767
- `Phalcon\Mvc\Model\Transaction\Manager` now correctly keeps account of transactions [#11554](https://github.com/phalcon/cphalcon/issues/11554)
68+
- `Phalcon\Db\Dialect\Sqlite` now maps additional column types to SQLite columns equivalents.
6869

6970
# [2.0.11](https://github.com/phalcon/cphalcon/releases/tag/phalcon-v2.0.11) (????-??-??)
7071
- Fix Model magic set functionality to maintain variable visibility and utilize setter methods.[#11286](https://github.com/phalcon/cphalcon/issues/11286)

phalcon/db/dialect/sqlite.zep

+52-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ class Sqlite extends Dialect
5454
let type = column->getTypeReference();
5555
}
5656

57+
// SQLite has dynamic column typing. The conversion below maximizes
58+
// compatibility with other DBMS's while following the type affinity
59+
// rules: http://www.sqlite.org/datatype3.html.
5760
switch type {
5861

5962
case Column::TYPE_INTEGER:
@@ -107,12 +110,60 @@ class Sqlite extends Dialect
107110
}
108111
break;
109112

113+
case Column::TYPE_BOOLEAN:
114+
if empty columnSql {
115+
let columnSql .= "TINYINT";
116+
}
117+
break;
118+
110119
case Column::TYPE_FLOAT:
111120
if empty columnSql {
112121
let columnSql .= "FLOAT";
113122
}
114123
break;
115124

125+
case Column::TYPE_DOUBLE:
126+
if empty columnSql {
127+
let columnSql .= "DOUBLE";
128+
}
129+
if column->isUnsigned() {
130+
let columnSql .= " UNSIGNED";
131+
}
132+
break;
133+
134+
case Column::TYPE_BIGINTEGER:
135+
if empty columnSql {
136+
let columnSql .= "BIGINT";
137+
}
138+
if column->isUnsigned() {
139+
let columnSql .= " UNSIGNED";
140+
}
141+
break;
142+
143+
case Column::TYPE_TINYBLOB:
144+
if empty columnSql {
145+
let columnSql .= "TINYBLOB";
146+
}
147+
break;
148+
149+
case Column::TYPE_BLOB:
150+
if empty columnSql {
151+
let columnSql .= "BLOB";
152+
}
153+
break;
154+
155+
case Column::TYPE_MEDIUMBLOB:
156+
if empty columnSql {
157+
let columnSql .= "MEDIUMBLOB";
158+
}
159+
break;
160+
161+
case Column::TYPE_LONGBLOB:
162+
if empty columnSql {
163+
let columnSql .= "LONGBLOB";
164+
}
165+
break;
166+
116167
default:
117168
if empty columnSql {
118169
throw new Exception("Unrecognized SQLite data type at column " . column->getName());
@@ -483,7 +534,7 @@ class Sqlite extends Dialect
483534
string sql;
484535

485536
let sql = "SELECT sql FROM sqlite_master WHERE type = 'index' AND tbl_name = ". this->escape(table) ." COLLATE NOCASE";
486-
537+
487538
if keyName {
488539
let sql .= " AND name = ". this->escape(keyName) ." COLLATE NOCASE";
489540
}

unit-tests/DbDialectTest.php

+136-11
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ private function getColumns()
101101
'notNull' => true,
102102
'default' => 'CURRENT_TIMESTAMP',
103103
)),
104+
'column14' => new Column("column14", array(
105+
'type' => Column::TYPE_TINYBLOB,
106+
'notNull' => true
107+
)),
108+
'column15' => new Column("column15", array(
109+
'type' => Column::TYPE_MEDIUMBLOB,
110+
'notNull' => true
111+
)),
112+
'column16' => new Column("column16", array(
113+
'type' => Column::TYPE_BLOB,
114+
'notNull' => true
115+
)),
116+
'column17' => new Column("column17", array(
117+
'type' => Column::TYPE_LONGBLOB,
118+
'notNull' => true
119+
)),
120+
'column18' => new Column("column18", array(
121+
'type' => Column::TYPE_BOOLEAN,
122+
)),
123+
'column19' => new Column("column19", array(
124+
'type' => Column::TYPE_DOUBLE,
125+
)),
126+
'column20' => new Column("column20", array(
127+
'type' => Column::TYPE_DOUBLE,
128+
'unsigned' => true
129+
))
104130
);
105131
}
106132

@@ -286,6 +312,47 @@ public function testDbColumn()
286312
$this->assertEquals($column13->getType(), Column::TYPE_TIMESTAMP);
287313
$this->assertTrue($column13->isNotNull());
288314
$this->assertEquals($column13->getDefault(), 'CURRENT_TIMESTAMP');
315+
316+
//Tinyblob column
317+
$column14 = $columns['column14'];
318+
$this->assertEquals($column14->getName(), 'column14');
319+
$this->assertEquals($column14->getType(), Column::TYPE_TINYBLOB);
320+
$this->assertTrue($column14->isNotNull());
321+
322+
//Mediumblob column
323+
$column15 = $columns['column15'];
324+
$this->assertEquals($column15->getName(), 'column15');
325+
$this->assertEquals($column15->getType(), Column::TYPE_MEDIUMBLOB);
326+
$this->assertTrue($column15->isNotNull());
327+
328+
//Blob column
329+
$column16 = $columns['column16'];
330+
$this->assertEquals($column16->getName(), 'column16');
331+
$this->assertEquals($column16->getType(), Column::TYPE_BLOB);
332+
$this->assertTrue($column16->isNotNull());
333+
334+
//Longblob column
335+
$column17 = $columns['column17'];
336+
$this->assertEquals($column17->getName(), 'column17');
337+
$this->assertEquals($column17->getType(), Column::TYPE_LONGBLOB);
338+
$this->assertTrue($column17->isNotNull());
339+
340+
//Boolean column
341+
$column18 = $columns['column18'];
342+
$this->assertEquals($column18->getName(), 'column18');
343+
$this->assertEquals($column18->getType(), Column::TYPE_BOOLEAN);
344+
345+
//Double column
346+
$column19 = $columns['column19'];
347+
$this->assertEquals($column19->getName(), 'column19');
348+
$this->assertEquals($column19->getType(), Column::TYPE_DOUBLE);
349+
$this->assertFalse($column19->isUnsigned());
350+
351+
//Unsigned double column
352+
$column20 = $columns['column20'];
353+
$this->assertEquals($column20->getName(), 'column20');
354+
$this->assertEquals($column20->getType(), Column::TYPE_DOUBLE);
355+
$this->assertTrue($column20->isUnsigned());
289356
}
290357

291358
public function testIndexes()
@@ -835,6 +902,13 @@ public function testSQLiteDialect()
835902
$this->assertEquals($dialect->getColumnDefinition($columns['column9']), 'VARCHAR(10)');
836903
$this->assertEquals($dialect->getColumnDefinition($columns['column10']), 'INTEGER');
837904
$this->assertEquals($dialect->getColumnDefinition($columns['column13']), 'TIMESTAMP');
905+
$this->assertEquals($dialect->getColumnDefinition($columns['column14']), 'TINYBLOB');
906+
$this->assertEquals($dialect->getColumnDefinition($columns['column15']), 'MEDIUMBLOB');
907+
$this->assertEquals($dialect->getColumnDefinition($columns['column16']), 'BLOB');
908+
$this->assertEquals($dialect->getColumnDefinition($columns['column17']), 'LONGBLOB');
909+
$this->assertEquals($dialect->getColumnDefinition($columns['column18']), 'TINYINT');
910+
$this->assertEquals($dialect->getColumnDefinition($columns['column19']), 'DOUBLE');
911+
$this->assertEquals($dialect->getColumnDefinition($columns['column20']), 'DOUBLE UNSIGNED');
838912

839913
//Add Columns
840914
$this->assertEquals($dialect->addColumn('table', null, $columns['column1']), 'ALTER TABLE "table" ADD COLUMN "column1" VARCHAR(10)');
@@ -859,6 +933,20 @@ public function testSQLiteDialect()
859933
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column10']), 'ALTER TABLE "schema"."table" ADD COLUMN "column10" INTEGER DEFAULT "10"');
860934
$this->assertEquals($dialect->addColumn('table', null, $columns['column13']), 'ALTER TABLE "table" ADD COLUMN "column13" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL');
861935
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column13']), 'ALTER TABLE "schema"."table" ADD COLUMN "column13" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL');
936+
$this->assertEquals($dialect->addColumn('table', null, $columns['column14']), 'ALTER TABLE "table" ADD COLUMN "column14" TINYBLOB NOT NULL');
937+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column14']), 'ALTER TABLE "schema"."table" ADD COLUMN "column14" TINYBLOB NOT NULL');
938+
$this->assertEquals($dialect->addColumn('table', null, $columns['column15']), 'ALTER TABLE "table" ADD COLUMN "column15" MEDIUMBLOB NOT NULL');
939+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column15']), 'ALTER TABLE "schema"."table" ADD COLUMN "column15" MEDIUMBLOB NOT NULL');
940+
$this->assertEquals($dialect->addColumn('table', null, $columns['column16']), 'ALTER TABLE "table" ADD COLUMN "column16" BLOB NOT NULL');
941+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column16']), 'ALTER TABLE "schema"."table" ADD COLUMN "column16" BLOB NOT NULL');
942+
$this->assertEquals($dialect->addColumn('table', null, $columns['column17']), 'ALTER TABLE "table" ADD COLUMN "column17" LONGBLOB NOT NULL');
943+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column17']), 'ALTER TABLE "schema"."table" ADD COLUMN "column17" LONGBLOB NOT NULL');
944+
$this->assertEquals($dialect->addColumn('table', null, $columns['column18']), 'ALTER TABLE "table" ADD COLUMN "column18" TINYINT');
945+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column18']), 'ALTER TABLE "schema"."table" ADD COLUMN "column18" TINYINT');
946+
$this->assertEquals($dialect->addColumn('table', null, $columns['column19']), 'ALTER TABLE "table" ADD COLUMN "column19" DOUBLE');
947+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column19']), 'ALTER TABLE "schema"."table" ADD COLUMN "column19" DOUBLE');
948+
$this->assertEquals($dialect->addColumn('table', null, $columns['column20']), 'ALTER TABLE "table" ADD COLUMN "column20" DOUBLE UNSIGNED');
949+
$this->assertEquals($dialect->addColumn('table', 'schema', $columns['column20']), 'ALTER TABLE "schema"."table" ADD COLUMN "column20" DOUBLE UNSIGNED');
862950

863951
//Modify Columns
864952
try {
@@ -1017,6 +1105,43 @@ public function testSQLiteDialect()
10171105
$expected .= ")";
10181106
$this->assertEquals($dialect->createTable('table', null, $definition), $expected);
10191107

1108+
$definition = array(
1109+
'columns' => array(
1110+
$columns['column14'],
1111+
$columns['column16'],
1112+
)
1113+
);
1114+
1115+
$expected = "CREATE TABLE \"table\" (\n";
1116+
$expected .= " `column14` TINYBLOB NOT NULL,\n";
1117+
$expected .= " `column16` BLOB NOT NULL\n";
1118+
$expected .= ")";
1119+
$this->assertEquals($dialect->createTable('table', null, $definition), $expected);
1120+
1121+
$definition = array(
1122+
'columns' => array(
1123+
$columns['column18'],
1124+
)
1125+
);
1126+
1127+
$expected = "CREATE TABLE \"table\" (\n";
1128+
$expected .= " `column18` TINYINT\n";
1129+
$expected .= ")";
1130+
$this->assertEquals($dialect->createTable('table', null, $definition), $expected);
1131+
1132+
$definition = array(
1133+
'columns' => array(
1134+
$columns['column19'],
1135+
$columns['column20'],
1136+
)
1137+
);
1138+
1139+
$expected = "CREATE TABLE \"table\" (\n";
1140+
$expected .= " `column19` DOUBLE,\n";
1141+
$expected .= " `column20` DOUBLE UNSIGNED\n";
1142+
$expected .= ")";
1143+
$this->assertEquals($dialect->createTable('table', null, $definition), $expected);
1144+
10201145
// issue 11359
10211146
$this->assertEquals($dialect->describeColumns('table', 'database.name.with.dots'), "PRAGMA table_info('table')");
10221147
}
@@ -1061,19 +1186,19 @@ public function testViews()
10611186

10621187
$this->assertEquals($dialect->listViews(), 'SELECT viewname AS view_name FROM pg_views WHERE schemaname = \'public\' ORDER BY view_name');
10631188

1064-
// SQLite
1065-
$dialect = new \Phalcon\Db\Dialect\Sqlite();
1189+
// SQLite
1190+
$dialect = new \Phalcon\Db\Dialect\Sqlite();
10661191

1067-
//Create View
1068-
$this->assertEquals($dialect->createView('test_view', $definition, null), 'CREATE VIEW "test_view" AS SELECT 1');
1069-
$this->assertEquals($dialect->createView('test_view', $definition, 'schema'), 'CREATE VIEW "schema"."test_view" AS SELECT 1');
1192+
//Create View
1193+
$this->assertEquals($dialect->createView('test_view', $definition, null), 'CREATE VIEW "test_view" AS SELECT 1');
1194+
$this->assertEquals($dialect->createView('test_view', $definition, 'schema'), 'CREATE VIEW "schema"."test_view" AS SELECT 1');
10701195

1071-
//Drop View
1072-
$this->assertEquals($dialect->dropView('test_view', null, false), 'DROP VIEW "test_view"');
1073-
$this->assertEquals($dialect->dropView('test_view', null, true), 'DROP VIEW IF EXISTS "test_view"');
1074-
$this->assertEquals($dialect->dropView('test_view', 'schema', false), 'DROP VIEW "schema"."test_view"');
1075-
$this->assertEquals($dialect->dropView('test_view', 'schema', true), 'DROP VIEW IF EXISTS "schema"."test_view"');
1196+
//Drop View
1197+
$this->assertEquals($dialect->dropView('test_view', null, false), 'DROP VIEW "test_view"');
1198+
$this->assertEquals($dialect->dropView('test_view', null, true), 'DROP VIEW IF EXISTS "test_view"');
1199+
$this->assertEquals($dialect->dropView('test_view', 'schema', false), 'DROP VIEW "schema"."test_view"');
1200+
$this->assertEquals($dialect->dropView('test_view', 'schema', true), 'DROP VIEW IF EXISTS "schema"."test_view"');
10761201

1077-
$this->assertEquals($dialect->listViews(), "SELECT tbl_name FROM sqlite_master WHERE type = 'view' ORDER BY tbl_name");
1202+
$this->assertEquals($dialect->listViews(), "SELECT tbl_name FROM sqlite_master WHERE type = 'view' ORDER BY tbl_name");
10781203
}
10791204
}

0 commit comments

Comments
 (0)