Skip to content

Commit db78470

Browse files
committed
Improve and simplify reserved identifier verification
1 parent bef8c6d commit db78470

2 files changed

Lines changed: 21 additions & 33 deletions

File tree

tests/WP_SQLite_Driver_Tests.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4144,27 +4144,27 @@ public function getReservedPrefixTestData(): array {
41444144
return array(
41454145
array(
41464146
'SELECT * FROM _wp_sqlite_t',
4147-
"Invalid identifier `_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4147+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41484148
),
41494149
array(
41504150
'SELECT _wp_sqlite_t FROM t',
4151-
"Invalid identifier `_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4151+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41524152
),
41534153
array(
41544154
'SELECT t._wp_sqlite_t FROM t',
4155-
"Invalid identifier `t`.`_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4155+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41564156
),
41574157
array(
41584158
'CREATE TABLE _wp_sqlite_t (id INT)',
4159-
"Invalid identifier `_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4159+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41604160
),
41614161
array(
41624162
'ALTER TABLE _wp_sqlite_t ADD COLUMN name TEXT',
4163-
"Invalid identifier `_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4163+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41644164
),
41654165
array(
41664166
'DROP TABLE _wp_sqlite_t',
4167-
"Invalid identifier `_wp_sqlite_t`, prefix '_wp_sqlite_' is reserved",
4167+
"Invalid identifier '_wp_sqlite_t', prefix '_wp_sqlite_' is reserved",
41684168
),
41694169
);
41704170
}

wp-includes/sqlite-ast/class-wp-sqlite-driver.php

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,6 +2791,17 @@ private function translate_string_literal( WP_Parser_Node $node ): string {
27912791
private function translate_pure_identifier( WP_Parser_Node $node ): string {
27922792
$token = $node->get_first_child_token();
27932793
$value = $token->get_value();
2794+
2795+
if ( str_starts_with( $value, self::RESERVED_PREFIX ) ) {
2796+
throw $this->new_driver_exception(
2797+
sprintf(
2798+
"Invalid identifier '%s', prefix '%s' is reserved",
2799+
$value,
2800+
self::RESERVED_PREFIX
2801+
)
2802+
);
2803+
}
2804+
27942805
return '`' . str_replace( '`', '``', $value ) . '`';
27952806
}
27962807

@@ -2811,8 +2822,7 @@ private function translate_qualified_identifier(
28112822
?WP_Parser_Node $object_node = null,
28122823
?WP_Parser_Node $child_node = null
28132824
): string {
2814-
$parts = array();
2815-
$uses_reserved_prefix = false;
2825+
$parts = array();
28162826

28172827
// Database name.
28182828
$is_information_schema = 'information_schema' === $this->db_name;
@@ -2861,38 +2871,16 @@ private function translate_qualified_identifier(
28612871
);
28622872
$parts[] = $this->information_schema_builder->get_table_name( false, $object_name );
28632873
} else {
2864-
$quoted_object_name = $this->translate( $object_node );
2865-
$object_name = $this->unquote_sqlite_identifier( $quoted_object_name );
2866-
if ( str_starts_with( $object_name, self::RESERVED_PREFIX ) ) {
2867-
$uses_reserved_prefix = true;
2868-
}
2869-
$parts[] = $quoted_object_name;
2874+
$parts[] = $this->translate( $object_node );
28702875
}
28712876
}
28722877

28732878
// Object child name (column, index, etc.).
28742879
if ( null !== $child_node ) {
2875-
$quoted_object_name = $this->translate( $child_node );
2876-
$object_name = $this->unquote_sqlite_identifier( $quoted_object_name );
2877-
if ( str_starts_with( $object_name, self::RESERVED_PREFIX ) ) {
2878-
$uses_reserved_prefix = true;
2879-
}
2880-
$parts[] = $quoted_object_name;
2881-
}
2882-
2883-
$identifier = implode( '.', $parts );
2884-
2885-
if ( true === $uses_reserved_prefix ) {
2886-
throw $this->new_driver_exception(
2887-
sprintf(
2888-
"Invalid identifier %s, prefix '%s' is reserved",
2889-
$identifier,
2890-
self::RESERVED_PREFIX
2891-
)
2892-
);
2880+
$parts[] = $this->translate( $child_node );
28932881
}
28942882

2895-
return $identifier;
2883+
return implode( '.', $parts );
28962884
}
28972885

28982886
/**

0 commit comments

Comments
 (0)