@@ -65,16 +65,17 @@ using v8::Uint8Array;
6565using v8::Value;
6666
6767inline MaybeLocal<String> Utf8StringMaybeOneByte (Isolate* isolate,
68- const char * data,
69- size_t length) {
70- int len = static_cast < int >(length);
71- if ( simdutf::validate_ascii (data, length)) {
72- return String::NewFromOneByte ( isolate,
73- reinterpret_cast <const uint8_t *>(data),
74- NewStringType::kNormal ,
75- len);
68+ std::string_view input) {
69+ int len = static_cast < int >(input. size ());
70+ if ( simdutf::validate_ascii (input. data (), input. size ())) {
71+ return String::NewFromOneByte (
72+ isolate,
73+ reinterpret_cast <const uint8_t *>(input. data () ),
74+ NewStringType::kNormal ,
75+ len);
7676 }
77- return String::NewFromUtf8 (isolate, data, NewStringType::kNormal , len);
77+ return String::NewFromUtf8 (
78+ isolate, input.data (), NewStringType::kNormal , len);
7879}
7980
8081#define CHECK_ERROR_OR_THROW (isolate, db, expr, expected, ret ) \
@@ -120,7 +121,9 @@ inline MaybeLocal<String> Utf8StringMaybeOneByte(Isolate* isolate,
120121 const char * v = \
121122 reinterpret_cast <const char *>(sqlite3_##from##_text (__VA_ARGS__)); \
122123 int v_len = sqlite3_##from##_bytes (__VA_ARGS__); \
123- (result) = Utf8StringMaybeOneByte ((isolate), v, v_len).As <Value>(); \
124+ (result) = \
125+ Utf8StringMaybeOneByte ((isolate), std::string_view (v, v_len)) \
126+ .As <Value>(); \
124127 break ; \
125128 } \
126129 case SQLITE_NULL: { \
@@ -2619,6 +2622,9 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
26192622 .As <Name>();
26202623}
26212624
2625+ // Returns cached internalized column name strings for this statement,
2626+ // invalidating the cache when SQLite re-prepares the statement (e.g. after
2627+ // schema changes like ALTER TABLE) detected via SQLITE_STMTSTATUS_REPREPARE.
26222628bool StatementSync::GetCachedColumnNames (LocalVector<Name>* keys) {
26232629 Isolate* isolate = env ()->isolate ();
26242630
@@ -3581,6 +3587,8 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
35813587 if (iter->stmt_ ->return_arrays_ ) {
35823588 row_value = Array::New (isolate, row_values.data (), row_values.size ());
35833589 } else {
3590+ // Use cached internalized column names to avoid repeated V8 string
3591+ // creation and enable hidden class sharing across row objects.
35843592 if (!iter->stmt_ ->GetCachedColumnNames (&row_keys)) return ;
35853593
35863594 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments