@@ -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,8 @@ 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) = Utf8StringMaybeOneByte ( \
117+ (isolate), std::string_view (v, v_len)).As <Value>(); \
116118 break ; \
117119 } \
118120 case SQLITE_NULL: { \
@@ -2346,6 +2348,9 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
23462348 .As <Name>();
23472349}
23482350
2351+ // Returns cached internalized column name strings for this statement,
2352+ // invalidating the cache when SQLite re-prepares the statement (e.g. after
2353+ // schema changes like ALTER TABLE) detected via SQLITE_STMTSTATUS_REPREPARE.
23492354bool StatementSync::GetCachedColumnNames (LocalVector<Name>* keys) {
23502355 Isolate* isolate = env ()->isolate ();
23512356
@@ -3302,6 +3307,8 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
33023307 if (iter->stmt_ ->return_arrays_ ) {
33033308 row_value = Array::New (isolate, row_values.data (), row_values.size ());
33043309 } else {
3310+ // Use cached internalized column names to avoid repeated V8 string
3311+ // creation and enable hidden class sharing across row objects.
33053312 if (!iter->stmt_ ->GetCachedColumnNames (&row_keys)) return ;
33063313
33073314 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments