diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c
new file mode 100644
index f9ab4ce..0fd28cd
*** a/src/backend/utils/adt/jsonb_gin.c
--- b/src/backend/utils/adt/jsonb_gin.c
*************** gin_extract_jsonb_hash(PG_FUNCTION_ARGS)
*** 315,326 ****
  		switch (r)
  		{
  			case WJB_BEGIN_ARRAY:
- 				tmp = stack;
- 				stack = (PathHashStack *) palloc(sizeof(PathHashStack));
- 				stack->next = tmp;
- 				stack->hash_state = tmp->hash_state;
- 				COMP_CRC32(stack->hash_state, PATH_SEPARATOR, 1);
- 				break;
  			case WJB_BEGIN_OBJECT:
  				/* Preserve stack item for key */
  				tmp = stack;
--- 315,320 ----
*************** gin_extract_jsonb_hash(PG_FUNCTION_ARGS)
*** 335,340 ****
--- 329,336 ----
  				break;
  			case WJB_VALUE:
  			case WJB_ELEM:
+ 				stack->hash_state = stack->next->hash_state;
+ 				COMP_CRC32(stack->hash_state, PATH_SEPARATOR, 1);
  				hash_stack_value(&v, stack);
  				path_crc32 = stack->hash_state;
  				FIN_CRC32(path_crc32);
diff --git a/src/test/regress/data/jsonb.data b/src/test/regress/data/jsonb.data
new file mode 100644
index 0672333..90bdc6c
*** a/src/test/regress/data/jsonb.data
--- b/src/test/regress/data/jsonb.data
***************
*** 989,994 ****
--- 989,997 ----
  {"title":"CBC", "status":66, "line":989}
  {}
  {"array":["foo", "bar", "baz"]}
+ {"array":["bar", "baz", "foo"]}
+ {"array":["bar", "baz"]}
+ {"array":["baz", "foo"]}
  {"line":991, "abstract":"BA", "node":"BBB"}
  {"line":992, "disabled":true, "pos":29, "public":false}
  {"state":53, "wait":"CB", "subtitle":"CCC", "line":993, "date":"CAC", "public":false, "coauthors":"BB"}
diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out
new file mode 100644
index e7a28f3..a916991
*** a/src/test/regress/expected/jsonb.out
--- b/src/test/regress/expected/jsonb.out
*************** SELECT 1 from testjsonb  WHERE j->'array
*** 744,750 ****
   ?column? 
  ----------
          1
! (1 row)
  
  SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']);
   jsonb_exists_any 
--- 744,752 ----
   ?column? 
  ----------
          1
!         1
!         1
! (3 rows)
  
  SELECT jsonb_exists_any('{"a":null, "b":"qq"}', ARRAY['a','b']);
   jsonb_exists_any 
*************** SELECT 1 from testjsonb  WHERE j->'array
*** 1437,1443 ****
   ?column? 
  ----------
          1
! (1 row)
  
  RESET enable_seqscan;
  DROP INDEX jidx;
--- 1439,1447 ----
   ?column? 
  ----------
          1
!         1
!         1
! (3 rows)
  
  RESET enable_seqscan;
  DROP INDEX jidx;
*************** SELECT count(*) FROM testjsonb WHERE j @
*** 1474,1479 ****
--- 1478,1495 ----
       2
  (1 row)
  
+ SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}';
+  count 
+ -------
+      3
+ (1 row)
+ 
+ SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}';
+  count 
+ -------
+      3
+ (1 row)
+ 
  SELECT count(*) FROM testjsonb WHERE j ? 'public';
   count 
  -------
*************** SELECT 1 from testjsonb  WHERE j->'array
*** 1498,1510 ****
   ?column? 
  ----------
          1
! (1 row)
  
  RESET enable_seqscan;
  SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow;
   count 
  -------
!   4784
  (1 row)
  
  SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key;
--- 1514,1528 ----
   ?column? 
  ----------
          1
!         1
!         1
! (3 rows)
  
  RESET enable_seqscan;
  SELECT count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow;
   count 
  -------
!   4787
  (1 row)
  
  SELECT key, count(*) FROM (SELECT (jsonb_each(j)).key FROM testjsonb) AS wow GROUP BY key ORDER BY count DESC, key;
*************** SELECT key, count(*) FROM (SELECT (jsonb
*** 1532,1553 ****
   subtitle  |   169
   auth      |   168
   abstract  |   161
   age       |     2
-  array     |     1
  (24 rows)
  
  -- sort/hash
  SELECT count(distinct j) FROM testjsonb;
   count 
  -------
!    887
  (1 row)
  
  SET enable_hashagg = off;
  SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
   count 
  -------
!    887
  (1 row)
  
  SET enable_hashagg = on;
--- 1550,1571 ----
   subtitle  |   169
   auth      |   168
   abstract  |   161
+  array     |     4
   age       |     2
  (24 rows)
  
  -- sort/hash
  SELECT count(distinct j) FROM testjsonb;
   count 
  -------
!    890
  (1 row)
  
  SET enable_hashagg = off;
  SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
   count 
  -------
!    890
  (1 row)
  
  SET enable_hashagg = on;
*************** SET enable_sort = off;
*** 1555,1561 ****
  SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
   count 
  -------
!    887
  (1 row)
  
  SELECT distinct * FROM (values (jsonb '{}' || ''),('{}')) v(j);
--- 1573,1579 ----
  SELECT count(*) FROM (SELECT j FROM (SELECT * FROM testjsonb UNION ALL SELECT * FROM testjsonb) js GROUP BY j) js2;
   count 
  -------
!    890
  (1 row)
  
  SELECT distinct * FROM (values (jsonb '{}' || ''),('{}')) v(j);
diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql
new file mode 100644
index 384bede..afe131f
*** a/src/test/regress/sql/jsonb.sql
--- b/src/test/regress/sql/jsonb.sql
*************** SELECT count(*) FROM testjsonb WHERE j @
*** 335,340 ****
--- 335,342 ----
  SELECT count(*) FROM testjsonb WHERE j @> '{"wait":"CC", "public":true}';
  SELECT count(*) FROM testjsonb WHERE j @> '{"age":25}';
  SELECT count(*) FROM testjsonb WHERE j @> '{"age":25.0}';
+ SELECT count(*) FROM testjsonb WHERE j @> '{"array":["foo"]}';
+ SELECT count(*) FROM testjsonb WHERE j @> '{"array":["bar"]}';
  SELECT count(*) FROM testjsonb WHERE j ? 'public';
  SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled'];
  SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
