@@ -57,16 +57,17 @@ using v8::Uint8Array;
5757using v8::Value;
5858
5959inline MaybeLocal<String> Utf8StringMaybeOneByte (Isolate* isolate,
60- const char * data,
61- size_t length) {
62- int len = static_cast < int >(length);
63- if ( simdutf::validate_ascii (data, length)) {
64- return String::NewFromOneByte ( isolate,
65- reinterpret_cast <const uint8_t *>(data),
66- NewStringType::kNormal ,
67- len);
60+ std::string_view input) {
61+ int len = static_cast < int >(input. size ());
62+ if ( simdutf::validate_ascii (input. data (), input. size ())) {
63+ return String::NewFromOneByte (
64+ isolate,
65+ reinterpret_cast <const uint8_t *>(input. data () ),
66+ NewStringType::kNormal ,
67+ len);
6868 }
69- return String::NewFromUtf8 (isolate, data, NewStringType::kNormal , len);
69+ return String::NewFromUtf8 (
70+ isolate, input.data (), NewStringType::kNormal , len);
7071}
7172
7273#define CHECK_ERROR_OR_THROW (isolate, db, expr, expected, ret ) \
@@ -112,7 +113,9 @@ inline MaybeLocal<String> Utf8StringMaybeOneByte(Isolate* isolate,
112113 const char * v = \
113114 reinterpret_cast <const char *>(sqlite3_##from##_text (__VA_ARGS__)); \
114115 int v_len = sqlite3_##from##_bytes (__VA_ARGS__); \
115- (result) = Utf8StringMaybeOneByte ((isolate), v, v_len).As <Value>(); \
116+ (result) = \
117+ Utf8StringMaybeOneByte ((isolate), std::string_view (v, v_len)) \
118+ .As <Value>(); \
116119 break ; \
117120 } \
118121 case SQLITE_NULL: { \
@@ -2346,6 +2349,9 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
23462349 .As <Name>();
23472350}
23482351
2352+ // Returns cached internalized column name strings for this statement,
2353+ // invalidating the cache when SQLite re-prepares the statement (e.g. after
2354+ // schema changes like ALTER TABLE) detected via SQLITE_STMTSTATUS_REPREPARE.
23492355bool StatementSync::GetCachedColumnNames (LocalVector<Name>* keys) {
23502356 Isolate* isolate = env ()->isolate ();
23512357
@@ -3302,6 +3308,8 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
33023308 if (iter->stmt_ ->return_arrays_ ) {
33033309 row_value = Array::New (isolate, row_values.data (), row_values.size ());
33043310 } else {
3311+ // Use cached internalized column names to avoid repeated V8 string
3312+ // creation and enable hidden class sharing across row objects.
33053313 if (!iter->stmt_ ->GetCachedColumnNames (&row_keys)) return ;
33063314
33073315 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments