diff options
| author | 2023-10-30 20:47:50 +0100 | |
|---|---|---|
| committer | 2023-10-30 20:47:50 +0100 | |
| commit | 0324df6f889f18500cc8d201fdc2845f3e4d1acf (patch) | |
| tree | fafa9ab06c7fc7a3d48392cd0fd1ac959cc40a37 | |
| parent | 06d00995049db9c7b915f67cfd4a5708aace458f (diff) | |
SQL increase length of VARCHAR fields (#5756)
* SQL increase length of VARCHAR fields
Increase length of all fields, keeping the limits for:
* Unique indexes on UTF-8: 191 bytes for MySQL;
* Unique indexes on ASCII: 767 bytes for MySQL;
* Max URL for external tools: 32768 characters;
* Max VARCHAR: 65535 bytes for MySQL;
Follow-up of https://github.com/FreshRSS/FreshRSS/pull/5038
Fix https://github.com/FreshRSS/FreshRSS/issues/4986
* Fix length test
| -rw-r--r-- | app/Models/Category.php | 2 | ||||
| -rw-r--r-- | app/Models/EntryDAO.php | 20 | ||||
| -rw-r--r-- | app/Models/FeedDAO.php | 4 | ||||
| -rw-r--r-- | app/Models/TagDAO.php | 4 | ||||
| -rw-r--r-- | app/SQL/install.sql.mysql.php | 26 | ||||
| -rw-r--r-- | app/SQL/install.sql.pgsql.php | 30 | ||||
| -rw-r--r-- | app/SQL/install.sql.sqlite.php | 30 | ||||
| -rw-r--r-- | tests/app/Models/CategoryTest.php | 3 |
8 files changed, 59 insertions, 60 deletions
diff --git a/app/Models/Category.php b/app/Models/Category.php index 3bb64df8b..370c49709 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -143,7 +143,7 @@ class FreshRSS_Category extends Minz_Model { } public function _name(string $value): void { - $this->name = mb_strcut(trim($value), 0, 255, 'UTF-8'); + $this->name = mb_strcut(trim($value), 0, FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE, 'UTF-8'); } /** @param array<FreshRSS_Feed>|FreshRSS_Feed $values */ diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php index b9f8d57cb..f7e9ffddc 100644 --- a/app/Models/EntryDAO.php +++ b/app/Models/EntryDAO.php @@ -109,18 +109,18 @@ SQL; } if ($this->addEntryPrepared) { $this->addEntryPrepared->bindParam(':id', $valuesTmp['id']); - $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); + $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 767); $valuesTmp['guid'] = safe_ascii($valuesTmp['guid']); $this->addEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 65535, 'UTF-8'); $valuesTmp['title'] = safe_utf8($valuesTmp['title']); $this->addEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 65535, 'UTF-8'); $valuesTmp['author'] = safe_utf8($valuesTmp['author']); $this->addEntryPrepared->bindParam(':author', $valuesTmp['author']); $valuesTmp['content'] = safe_utf8($valuesTmp['content']); $this->addEntryPrepared->bindParam(':content', $valuesTmp['content']); - $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); + $valuesTmp['link'] = substr($valuesTmp['link'], 0, 32768); $valuesTmp['link'] = safe_ascii($valuesTmp['link']); $this->addEntryPrepared->bindParam(':link', $valuesTmp['link']); $valuesTmp['date'] = min($valuesTmp['date'], 2147483647); @@ -134,7 +134,7 @@ SQL; $valuesTmp['is_favorite'] = $valuesTmp['is_favorite'] ? 1 : 0; $this->addEntryPrepared->bindParam(':is_favorite', $valuesTmp['is_favorite'], PDO::PARAM_INT); $this->addEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 65535, 'UTF-8'); $valuesTmp['tags'] = safe_utf8($valuesTmp['tags']); $this->addEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if (!isset($valuesTmp['attributes'])) { @@ -215,18 +215,18 @@ SQL; $this->updateEntryPrepared = $this->pdo->prepare($sql) ?: null; } if ($this->updateEntryPrepared) { - $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760); + $valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 767); $valuesTmp['guid'] = safe_ascii($valuesTmp['guid']); $this->updateEntryPrepared->bindParam(':guid', $valuesTmp['guid']); - $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8'); + $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 65535, 'UTF-8'); $valuesTmp['title'] = safe_utf8($valuesTmp['title']); $this->updateEntryPrepared->bindParam(':title', $valuesTmp['title']); - $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8'); + $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 65535, 'UTF-8'); $valuesTmp['author'] = safe_utf8($valuesTmp['author']); $this->updateEntryPrepared->bindParam(':author', $valuesTmp['author']); $valuesTmp['content'] = safe_utf8($valuesTmp['content']); $this->updateEntryPrepared->bindParam(':content', $valuesTmp['content']); - $valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023); + $valuesTmp['link'] = substr($valuesTmp['link'], 0, 32768); $valuesTmp['link'] = safe_ascii($valuesTmp['link']); $this->updateEntryPrepared->bindParam(':link', $valuesTmp['link']); $valuesTmp['date'] = min($valuesTmp['date'], 2147483647); @@ -243,7 +243,7 @@ SQL; $this->updateEntryPrepared->bindValue(':is_favorite', $valuesTmp['is_favorite'] ? 1 : 0, PDO::PARAM_INT); } $this->updateEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT); - $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8'); + $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 65535, 'UTF-8'); $valuesTmp['tags'] = safe_utf8($valuesTmp['tags']); $this->updateEntryPrepared->bindParam(':tags', $valuesTmp['tags']); if (!isset($valuesTmp['attributes'])) { diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 508d38bfc..127702765 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -58,10 +58,10 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo { $valuesTmp['category'], mb_strcut(trim($valuesTmp['name']), 0, FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE, 'UTF-8'), $valuesTmp['website'], - sanitizeHTML($valuesTmp['description'], '', 1023), + sanitizeHTML($valuesTmp['description'], ''), $valuesTmp['lastUpdate'], isset($valuesTmp['priority']) ? (int)$valuesTmp['priority'] : FreshRSS_Feed::PRIORITY_MAIN_STREAM, - mb_strcut($valuesTmp['pathEntries'], 0, 511, 'UTF-8'), + mb_strcut($valuesTmp['pathEntries'], 0, 65535, 'UTF-8'), base64_encode($valuesTmp['httpAuth']), isset($valuesTmp['error']) ? (int)$valuesTmp['error'] : 0, isset($valuesTmp['ttl']) ? (int)$valuesTmp['ttl'] : FreshRSS_Feed::TTL_DEFAULT, diff --git a/app/Models/TagDAO.php b/app/Models/TagDAO.php index b41a6de72..8c0b94c46 100644 --- a/app/Models/TagDAO.php +++ b/app/Models/TagDAO.php @@ -20,7 +20,7 @@ WHERE NOT EXISTS (SELECT 1 FROM `_category` WHERE name = TRIM(?)) SQL; $stm = $this->pdo->prepare($sql); - $valuesTmp['name'] = mb_strcut(trim($valuesTmp['name']), 0, 63, 'UTF-8'); + $valuesTmp['name'] = mb_strcut(trim($valuesTmp['name']), 0, FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE, 'UTF-8'); if (!isset($valuesTmp['attributes'])) { $valuesTmp['attributes'] = []; } @@ -61,7 +61,7 @@ UPDATE `_tag` SET name=? WHERE id=? AND NOT EXISTS (SELECT 1 FROM `_category` WHERE name = ?) SQL; - $name = mb_strcut(trim($name), 0, 63, 'UTF-8'); + $name = mb_strcut(trim($name), 0, FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE, 'UTF-8'); $stm = $this->pdo->prepare($sql); if ($stm !== false && $stm->bindValue(':id', $id, PDO::PARAM_INT) && diff --git a/app/SQL/install.sql.mysql.php b/app/SQL/install.sql.mysql.php index 74fc65b19..cb12fa179 100644 --- a/app/SQL/install.sql.mysql.php +++ b/app/SQL/install.sql.mysql.php @@ -26,8 +26,8 @@ CREATE TABLE IF NOT EXISTS `_feed` ( `description` TEXT, `lastUpdate` INT(11) DEFAULT 0, -- Until year 2038 `priority` TINYINT(2) NOT NULL DEFAULT 10, - `pathEntries` VARCHAR(511) DEFAULT NULL, - `httpAuth` VARCHAR(511) DEFAULT NULL, + `pathEntries` VARCHAR(65535) DEFAULT NULL, + `httpAuth` VARCHAR(1024) DEFAULT NULL, `error` BOOLEAN DEFAULT 0, `ttl` INT NOT NULL DEFAULT 0, -- v0.7.3 `attributes` TEXT, -- v1.11.0 @@ -42,18 +42,18 @@ ENGINE = INNODB; CREATE TABLE IF NOT EXISTS `_entry` ( `id` BIGINT NOT NULL, -- v0.7 - `guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, -- Maximum for UNIQUE is 767B - `title` VARCHAR(255) NOT NULL, - `author` VARCHAR(255), + `guid` VARCHAR(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, -- Maximum for UNIQUE is 767B + `title` VARCHAR(65535) NOT NULL, + `author` VARCHAR(65535), `content_bin` MEDIUMBLOB, -- v0.7 - `link` VARCHAR(1023) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, + `link` VARCHAR(32768) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, `date` INT(11), -- Until year 2038 `lastSeen` INT(11) DEFAULT 0, -- v1.1.1, Until year 2038 `hash` BINARY(16), -- v1.1.1 `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, `id_feed` INT, -- 1.20.0 - `tags` VARCHAR(1023), + `tags` VARCHAR(65535), `attributes` TEXT, -- v1.20.0 PRIMARY KEY (`id`), FOREIGN KEY (`id_feed`) REFERENCES `_feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -69,18 +69,18 @@ INSERT IGNORE INTO `_category` (id, name) VALUES(1, "Uncategorized"); CREATE TABLE IF NOT EXISTS `_entrytmp` ( -- v1.7 `id` BIGINT NOT NULL, - `guid` VARCHAR(760) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, - `title` VARCHAR(255) NOT NULL, - `author` VARCHAR(255), + `guid` VARCHAR(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, + `title` VARCHAR(65535) NOT NULL, + `author` VARCHAR(65535), `content_bin` MEDIUMBLOB, - `link` VARCHAR(1023) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, + `link` VARCHAR(32768) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, `date` INT(11), `lastSeen` INT(11) DEFAULT 0, `hash` BINARY(16), `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, `id_feed` INT, -- 1.20.0 - `tags` VARCHAR(1023), + `tags` VARCHAR(65535), `attributes` TEXT, -- v1.20.0 PRIMARY KEY (`id`), FOREIGN KEY (`id_feed`) REFERENCES `_feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -91,7 +91,7 @@ ENGINE = INNODB; CREATE TABLE IF NOT EXISTS `_tag` ( -- v1.12 `id` INT NOT NULL AUTO_INCREMENT, - `name` VARCHAR(63) NOT NULL, + `name` VARCHAR(191) NOT NULL, `attributes` TEXT, PRIMARY KEY (`id`), UNIQUE KEY (`name`) diff --git a/app/SQL/install.sql.pgsql.php b/app/SQL/install.sql.pgsql.php index 2149fc247..4f7f1cf89 100644 --- a/app/SQL/install.sql.pgsql.php +++ b/app/SQL/install.sql.pgsql.php @@ -6,7 +6,7 @@ SQL; $GLOBALS['SQL_CREATE_TABLES'] = <<<'SQL' CREATE TABLE IF NOT EXISTS `_category` ( "id" SERIAL PRIMARY KEY, - "name" VARCHAR(255) UNIQUE NOT NULL, + "name" VARCHAR(191) UNIQUE NOT NULL, "kind" SMALLINT DEFAULT 0, -- 1.20.0 "lastUpdate" BIGINT DEFAULT 0, -- 1.20.0 "error" SMALLINT DEFAULT 0, -- 1.20.0 @@ -18,13 +18,13 @@ CREATE TABLE IF NOT EXISTS `_feed` ( "url" VARCHAR(32768) NOT NULL, "kind" SMALLINT DEFAULT 0, -- 1.20.0 "category" INT DEFAULT 0, -- 1.20.0 - "name" VARCHAR(255) NOT NULL, + "name" VARCHAR(191) NOT NULL, "website" VARCHAR(32768), "description" TEXT, "lastUpdate" INT DEFAULT 0, "priority" SMALLINT NOT NULL DEFAULT 10, - "pathEntries" VARCHAR(511) DEFAULT NULL, - "httpAuth" VARCHAR(511) DEFAULT NULL, + "pathEntries" VARCHAR(65535) DEFAULT NULL, + "httpAuth" VARCHAR(1024) DEFAULT NULL, "error" SMALLINT DEFAULT 0, "ttl" INT NOT NULL DEFAULT 0, "attributes" TEXT, -- v1.11.0 @@ -37,18 +37,18 @@ CREATE INDEX IF NOT EXISTS `_priority_index` ON `_feed` ("priority"); CREATE TABLE IF NOT EXISTS `_entry` ( "id" BIGINT NOT NULL PRIMARY KEY, - "guid" VARCHAR(760) NOT NULL, - "title" VARCHAR(255) NOT NULL, - "author" VARCHAR(255), + "guid" VARCHAR(767) NOT NULL, + "title" VARCHAR(65535) NOT NULL, + "author" VARCHAR(65535), "content" TEXT, - "link" VARCHAR(1023) NOT NULL, + "link" VARCHAR(32768) NOT NULL, "date" INT, "lastSeen" INT DEFAULT 0, "hash" BYTEA, "is_read" SMALLINT NOT NULL DEFAULT 0, "is_favorite" SMALLINT NOT NULL DEFAULT 0, "id_feed" INT, -- 1.20.0 - "tags" VARCHAR(1023), + "tags" VARCHAR(65535), "attributes" TEXT, -- v1.20.0 FOREIGN KEY ("id_feed") REFERENCES `_feed` ("id") ON DELETE CASCADE ON UPDATE CASCADE, UNIQUE ("id_feed","guid") @@ -65,18 +65,18 @@ INSERT INTO `_category` (id, name) CREATE TABLE IF NOT EXISTS `_entrytmp` ( -- v1.7 "id" BIGINT NOT NULL PRIMARY KEY, - "guid" VARCHAR(760) NOT NULL, - "title" VARCHAR(255) NOT NULL, - "author" VARCHAR(255), + "guid" VARCHAR(767) NOT NULL, + "title" VARCHAR(65535) NOT NULL, + "author" VARCHAR(65535), "content" TEXT, - "link" VARCHAR(1023) NOT NULL, + "link" VARCHAR(32768) NOT NULL, "date" INT, "lastSeen" INT DEFAULT 0, "hash" BYTEA, "is_read" SMALLINT NOT NULL DEFAULT 0, "is_favorite" SMALLINT NOT NULL DEFAULT 0, "id_feed" INT, -- 1.20.0 - "tags" VARCHAR(1023), + "tags" VARCHAR(65535), "attributes" TEXT, -- v1.20.0 FOREIGN KEY ("id_feed") REFERENCES `_feed` ("id") ON DELETE CASCADE ON UPDATE CASCADE, UNIQUE ("id_feed","guid") @@ -85,7 +85,7 @@ CREATE INDEX IF NOT EXISTS `_entrytmp_date_index` ON `_entrytmp` ("date"); CREATE TABLE IF NOT EXISTS `_tag` ( -- v1.12 "id" SERIAL PRIMARY KEY, - "name" VARCHAR(63) UNIQUE NOT NULL, + "name" VARCHAR(191) UNIQUE NOT NULL, "attributes" TEXT ); CREATE TABLE IF NOT EXISTS `_entrytag` ( diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php index b353f361e..1369bad25 100644 --- a/app/SQL/install.sql.sqlite.php +++ b/app/SQL/install.sql.sqlite.php @@ -6,7 +6,7 @@ SQL; $GLOBALS['SQL_CREATE_TABLES'] = <<<'SQL' CREATE TABLE IF NOT EXISTS `category` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - `name` VARCHAR(255) NOT NULL, + `name` VARCHAR(191) NOT NULL, `kind` SMALLINT DEFAULT 0, -- 1.20.0 `lastUpdate` BIGINT DEFAULT 0, -- 1.20.0 `error` SMALLINT DEFAULT 0, -- 1.20.0 @@ -19,13 +19,13 @@ CREATE TABLE IF NOT EXISTS `feed` ( `url` VARCHAR(32768) NOT NULL, `kind` SMALLINT DEFAULT 0, -- 1.20.0 `category` INTEGER DEFAULT 0, -- 1.20.0 - `name` VARCHAR(255) NOT NULL, + `name` VARCHAR(191) NOT NULL, `website` VARCHAR(32768), `description` TEXT, `lastUpdate` INT(11) DEFAULT 0, -- Until year 2038 `priority` TINYINT(2) NOT NULL DEFAULT 10, - `pathEntries` VARCHAR(511) DEFAULT NULL, - `httpAuth` VARCHAR(511) DEFAULT NULL, + `pathEntries` VARCHAR(65535) DEFAULT NULL, + `httpAuth` VARCHAR(1024) DEFAULT NULL, `error` BOOLEAN DEFAULT 0, `ttl` INT NOT NULL DEFAULT 0, `attributes` TEXT, -- v1.11.0 @@ -38,18 +38,18 @@ CREATE INDEX IF NOT EXISTS feed_priority_index ON `feed`(`priority`); CREATE TABLE IF NOT EXISTS `entry` ( `id` BIGINT NOT NULL, - `guid` VARCHAR(760) NOT NULL, - `title` VARCHAR(255) NOT NULL, - `author` VARCHAR(255), + `guid` VARCHAR(767) NOT NULL, + `title` VARCHAR(65535) NOT NULL, + `author` VARCHAR(65535), `content` TEXT, - `link` VARCHAR(1023) NOT NULL, + `link` VARCHAR(32768) NOT NULL, `date` INT(11), -- Until year 2038 `lastSeen` INT(11) DEFAULT 0, -- v1.1.1, Until year 2038 `hash` BINARY(16), -- v1.1.1 `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, `id_feed` INTEGER, -- 1.20.0 - `tags` VARCHAR(1023), + `tags` VARCHAR(65535), `attributes` TEXT, -- v1.20.0 PRIMARY KEY (`id`), FOREIGN KEY (`id_feed`) REFERENCES `feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -64,18 +64,18 @@ INSERT OR IGNORE INTO `category` (id, name) VALUES(1, "Uncategorized"); CREATE TABLE IF NOT EXISTS `entrytmp` ( -- v1.7 `id` BIGINT NOT NULL, - `guid` VARCHAR(760) NOT NULL, - `title` VARCHAR(255) NOT NULL, - `author` VARCHAR(255), + `guid` VARCHAR(767) NOT NULL, + `title` VARCHAR(65535) NOT NULL, + `author` VARCHAR(65535), `content` TEXT, - `link` VARCHAR(1023) NOT NULL, + `link` VARCHAR(32768) NOT NULL, `date` INT(11), `lastSeen` INT(11) DEFAULT 0, `hash` BINARY(16), `is_read` BOOLEAN NOT NULL DEFAULT 0, `is_favorite` BOOLEAN NOT NULL DEFAULT 0, `id_feed` INTEGER, -- 1.20.0 - `tags` VARCHAR(1023), + `tags` VARCHAR(65535), `attributes` TEXT, -- v1.20.0 PRIMARY KEY (`id`), FOREIGN KEY (`id_feed`) REFERENCES `feed`(`id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -85,7 +85,7 @@ CREATE INDEX IF NOT EXISTS entrytmp_date_index ON `entrytmp`(`date`); CREATE TABLE IF NOT EXISTS `tag` ( -- v1.12 `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - `name` VARCHAR(63) NOT NULL, + `name` VARCHAR(191) NOT NULL, `attributes` TEXT, UNIQUE (`name`) ); diff --git a/tests/app/Models/CategoryTest.php b/tests/app/Models/CategoryTest.php index b332cb524..afa74d53f 100644 --- a/tests/app/Models/CategoryTest.php +++ b/tests/app/Models/CategoryTest.php @@ -24,8 +24,7 @@ class CategoryTest extends PHPUnit\Framework\TestCase { array(' this string needs trimming on left', 'this string needs trimming on left'), array('this string needs trimming on right ', 'this string needs trimming on right'), array(' this string needs trimming on both ends ', 'this string needs trimming on both ends'), - array(str_repeat('This string needs to be shortened because its length is way too long. ', 4), - str_repeat('This string needs to be shortened because its length is way too long. ', 3) . 'This string needs to be shortened because its'), + array(str_repeat('X', 512), str_repeat('X', FreshRSS_DatabaseDAO::LENGTH_INDEX_UNICODE)), // max length ); } |
