Skip to content

Commit 57aab3a

Browse files
committed
Fixed bug with indexing into repeated fields.
Fixes #3
1 parent dd5de67 commit 57aab3a

File tree

4 files changed

+29
-6
lines changed

4 files changed

+29
-6
lines changed

expected/postgres_protobuf.out

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,14 @@ SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[1].repeated_inner
361361
result
362362
bbb
363363
(1 row)
364+
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].inner_str', '\x2a0e0a046c766c311a060a046c766c32'::BYTEA) AS result;
365+
result
366+
lvl1
367+
(1 row)
368+
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].repeated_inner[0].inner_str', '\x2a0e0a046c766c311a060a046c766c32'::BYTEA) AS result;
369+
result
370+
lvl2
371+
(1 row)
364372
--
365373
-- Indexing into maps
366374
--

generate_test_cases.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ def pg_quote(s)
280280
test_sql("SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[1].repeated_inner[0].inner_str', #{pg_proto}) AS result;", ['aaa'])
281281
test_sql("SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[1].repeated_inner[1].inner_str', #{pg_proto}) AS result;", ['bbb'])
282282
end
283+
284+
with_proto('repeated_inner: { inner_str: "lvl1", repeated_inner: { inner_str: "lvl2" } }') do
285+
test_sql("SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].inner_str', #{pg_proto}) AS result;", ['lvl1'])
286+
test_sql("SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].repeated_inner[0].inner_str', #{pg_proto}) AS result;", ['lvl2'])
287+
end
283288
end
284289

285290
section "Indexing into maps" do

querying.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ class FieldSelector : public ProtobufVisitor {
613613
is_packed_(is_packed),
614614
wanted_index_(-1),
615615
state_(State::Scanning),
616+
current_field_(0),
616617
current_index_(0) {
617618
PGPROTO_DEBUG("Created field selector %d %lx", wanted_field,
618619
intptr_t(this));
@@ -623,19 +624,20 @@ class FieldSelector : public ProtobufVisitor {
623624
void Pushed(ProtobufTraverser* traverser) override { traverser_ = traverser; }
624625

625626
ProtobufVisitor* BeginField(int number, int wire_type) override {
627+
current_field_ = number;
626628
if (wire_type == 2) {
627629
if (is_packed_) {
628630
state_ = State::EmittingPacked;
629631
} else {
630-
if (WantThisField(number)) {
632+
if (ShouldEmitCurrentIndex()) {
631633
if (ty_ == pb::FieldDescriptor::Type::TYPE_MESSAGE) {
632634
return next_;
633635
} else {
634636
state_ = State::EmittingOtherComposite;
635637
}
636638
}
637639
}
638-
} else if (WantThisField(number)) {
640+
} else if (ShouldEmitCurrentIndex()) {
639641
return next_;
640642
}
641643
return this;
@@ -645,7 +647,7 @@ class FieldSelector : public ProtobufVisitor {
645647
ReadLengthDelimitedField(const FieldInfo& field) override {
646648
if (state_ == State::EmittingPacked) {
647649
return std::make_pair(PackedCompositeFieldTreatmentForType(ty_), this);
648-
} else if (WantThisField(field.number)) {
650+
} else if (ShouldEmitCurrentIndex()) {
649651
if (state_ == State::EmittingOtherComposite) {
650652
return std::make_pair(CompositeFieldTreatmentForType(ty_), next_);
651653
} else {
@@ -656,10 +658,15 @@ class FieldSelector : public ProtobufVisitor {
656658
}
657659
}
658660

659-
void EndField() override { ++current_index_; }
661+
void EndField() override {
662+
if (current_field_ == wanted_field_) {
663+
++current_index_;
664+
}
665+
}
660666

661667
void Popped() override {
662668
state_ = State::Scanning;
669+
current_field_ = 0;
663670
current_index_ = 0;
664671
}
665672

@@ -676,10 +683,11 @@ class FieldSelector : public ProtobufVisitor {
676683
EmittingOtherComposite,
677684
};
678685
State state_;
686+
int current_field_;
679687
int current_index_;
680688

681-
bool WantThisField(int number) const {
682-
return number == wanted_field_ &&
689+
bool ShouldEmitCurrentIndex() const {
690+
return current_field_ == wanted_field_ &&
683691
(wanted_index_ == -1 || current_index_ == wanted_index_);
684692
}
685693
};

sql/postgres_protobuf.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].repeated_inner
185185
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].repeated_inner[1].inner_str', '\x2a0e1a050a036162631a050a036465662a0e1a050a036161611a050a03626262'::BYTEA) AS result;
186186
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[1].repeated_inner[0].inner_str', '\x2a0e1a050a036162631a050a036465662a0e1a050a036161611a050a03626262'::BYTEA) AS result;
187187
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[1].repeated_inner[1].inner_str', '\x2a0e1a050a036162631a050a036465662a0e1a050a036161611a050a03626262'::BYTEA) AS result;
188+
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].inner_str', '\x2a0e0a046c766c311a060a046c766c32'::BYTEA) AS result;
189+
SELECT protobuf_query('pgpb.test.ExampleMessage:repeated_inner[0].repeated_inner[0].inner_str', '\x2a0e0a046c766c311a060a046c766c32'::BYTEA) AS result;
188190
--
189191
-- Indexing into maps
190192
--

0 commit comments

Comments
 (0)