1. 20 Mar, 2018 3 commits
    • Robert Haas's avatar
      Defer creation of partially-grouped relation until it's needed. · 4f15e5d0
      Robert Haas authored
      This avoids unnecessarily creating a RelOptInfo for which we have no
      actual need.  This idea is from Ashutosh Bapat, who wrote a very
      different patch to accomplish a similar goal.  It will be more
      important if and when we get partition-wise aggregate, since then
      there could be many partially grouped relations all of which could
      potentially be unnecessary.  In passing, this sets the grouping
      relation's reltarget, which wasn't done previously but makes things
      simpler for this refactoring.
      
      Along the way, adjust things so that add_paths_to_partial_grouping_rel,
      now renamed create_partial_grouping_paths, does not perform the Gather
      or Gather Merge steps to generate non-partial paths from partial
      paths; have the caller do it instead.  This is again for the
      convenience of partition-wise aggregate, which wants to inject
      additional partial paths are created and before we decide which ones
      to Gather/Gather Merge.  This might seem like a separate change, but
      it's actually pretty closely entangled; I couldn't really see much
      value in separating it and having to change some things twice.
      
      Patch by me, reviewed by Ashutosh Bapat.
      
      Discussion: http://postgr.es/m/CA+TgmoZ+ZJTVad-=vEq393N99KTooxv9k7M+z73qnTAqkb49BQ@mail.gmail.com
      4f15e5d0
    • Alvaro Herrera's avatar
      Fix CommandCounterIncrement in partition-related DDL · 4dba331c
      Alvaro Herrera authored
      It makes sense to do the CCIs in the places that do catalog updates,
      rather than before the places that error out because the former ones
      fail to do it.  In particular, it looks like StorePartitionBound() and
      IndexSetParentIndex() ought to make their own CCIs.
      
      Per review comments from Peter Eisentraut for row-level triggers on
      partitioned tables.
      
      Discussion: https://postgr.es/m/20171229225319.ajltgss2ojkfd3kp@alvherre.pgsql
      4dba331c
    • Tom Lane's avatar
      Prevent query-lifespan memory leakage of SP-GiST traversal values. · 467963c3
      Tom Lane authored
      The original coding of the SP-GiST scan traversalValue feature (commit
      ccd6eb49) arranged for traversal values to be stored in the query's main
      executor context.  That's fine if there's only one index scan per query,
      but if there are many, we have a memory leak as successive scans create
      new traversal values.  Fix it by creating a separate memory context for
      traversal values, which we can reset during spgrescan().  Back-patch
      to 9.6 where this code was introduced.
      
      In principle, adding the traversalCxt field to SpGistScanOpaqueData
      creates an ABI break in the back branches.  But I (tgl) have little
      sympathy for extensions including spgist_private.h, so I'm not very
      worried about that.  Alternatively we could stick the new field at the
      end of the struct in back branches, but that has its own downsides.
      
      Anton Dignös, reviewed by Alexander Kuzmenkov
      
      Discussion: https://postgr.es/m/CALNdv1jb6y2Te-m8xHLxLX12RsBmZJ1f4hESX7J0HjgyOhA9eA@mail.gmail.com
      467963c3
  2. 19 Mar, 2018 10 commits
    • Peter Eisentraut's avatar
      Add missing break · 13c7c65e
      Peter Eisentraut authored
      13c7c65e
    • Tom Lane's avatar
      Fix some corner-case issues in REFRESH MATERIALIZED VIEW CONCURRENTLY. · 6497a18e
      Tom Lane authored
      refresh_by_match_merge() has some issues in the way it builds a SQL
      query to construct the "diff" table:
      
      1. It doesn't require the selected unique index(es) to be indimmediate.
      2. It doesn't pay attention to the particular equality semantics enforced
      by a given index, but just assumes that they must be those of the column
      datatype's default btree opclass.
      3. It doesn't check that the indexes are btrees.
      4. It's insufficiently careful to ensure that the parser will pick the
      intended operator when parsing the query.  (This would have been a
      security bug before CVE-2018-1058.)
      5. It's not careful about indexes on system columns.
      
      The way to fix #4 is to make use of the existing code in ri_triggers.c
      for generating an arbitrary binary operator clause.  I chose to move
      that to ruleutils.c, since that seems a more reasonable place to be
      exporting such functionality from than ri_triggers.c.
      
      While #1, #3, and #5 are just latent given existing feature restrictions,
      and #2 doesn't arise in the core system for lack of alternate opclasses
      with different equality behaviors, #4 seems like an issue worth
      back-patching.  That's the bulk of the change anyway, so just back-patch
      the whole thing to 9.4 where this code was introduced.
      
      Discussion: https://postgr.es/m/13836.1521413227@sss.pgh.pa.us
      6497a18e
    • Andrew Dunstan's avatar
      Don't use an Msys virtual path to create a tablespace · 9ad21a69
      Andrew Dunstan authored
      The new unlogged_reinit recovery tests create a new tablespace using
      TestLib.pm's tempdir. However, on msys that function returns a virtual
      path that isn't understood by Postgres. Here we add a new function to
      TestLib.pm to turn such a path into a real path on the underlying file
      system, and use it in the new test to create the tablespace. The new
      function is essentially a NOOP everywhere but msys.
      9ad21a69
    • Tom Lane's avatar
      Fix performance hazard in REFRESH MATERIALIZED VIEW CONCURRENTLY. · 6fbd5cce
      Tom Lane authored
      Jeff Janes discovered that commit 7ca25b7d made one of the queries run by
      REFRESH MATERIALIZED VIEW CONCURRENTLY perform badly.  The root cause is
      bad cardinality estimation for correlated quals, but a principled solution
      to that problem is some way off, especially since the planner lacks any
      statistics about whole-row variables.  Moreover, in non-error cases this
      query produces no rows, meaning it must be run to completion; but use of
      LIMIT 1 encourages the planner to pick a fast-start, slow-completion plan,
      exactly not what we want.  Remove the LIMIT clause, and instead rely on
      the count parameter we pass to SPI_execute() to prevent excess work if the
      query does return some rows.
      
      While we've heard no field reports of planner misbehavior with this query,
      it could be that people are having performance issues that haven't reached
      the level of pain needed to cause a bug report.  In any case, that LIMIT
      clause can't possibly do anything helpful with any existing version of the
      planner, and it demonstrably can cause bad choices in some cases, so
      back-patch to 9.4 where the code was introduced.
      
      Thomas Munro
      
      Discussion: https://postgr.es/m/CAMkU=1z-JoGymHneGHar1cru4F1XDfHqJDzxP_CtK5cL3DOfmg@mail.gmail.com
      6fbd5cce
    • Alvaro Herrera's avatar
      Remove unnecessary members from ModifyTableState and ExecInsert · ee0a1fc8
      Alvaro Herrera authored
      These values can be obtained from the ModifyTable node which is already
      a part of both the ModifyTableState and ExecInsert.
      
      Author: Álvaro Herrera, Amit Langote
      Reviewed-by: Peter Geoghegan
      Discussion: https://postgr.es/m/20180316151303.rml2p5wffn3o6qy6@alvherre.pgsql
      ee0a1fc8
    • Alvaro Herrera's avatar
      Expand comment a little bit · 839a8eb2
      Alvaro Herrera authored
      The previous commit removed a comment that was a bit more verbose than
      its replacement.
      839a8eb2
    • Alvaro Herrera's avatar
      Fix state reversal after partition tuple routing · 6666ee49
      Alvaro Herrera authored
      We make some changes to ModifyTableState and the EState it uses whenever
      we route tuples to partitions; but we weren't restoring properly in all
      cases, possibly causing crashes when partitions with different tuple
      descriptors are targeted by tuples inserted in the same command.
      Refactor some code, creating ExecPrepareTupleRouting, to encapsulate the
      needed state changing logic, and have it invoked one level above its
      current place (ie. put it in ExecModifyTable instead of ExecInsert);
      this makes it all more readable.
      
      Add a test case to exercise this.
      
      We don't support having views as partitions; and since only views can
      have INSTEAD OF triggers, there is no point in testing for INSTEAD OF
      when processing insertions into a partitioned table.  Remove code that
      appears to support this (but which is actually never relevant.)
      
      In passing, fix location of some very confusing comments in
      ModifyTableState.
      
      Reported-by: Amit Langote
      Author: Etsuro Fujita, Amit Langote
      Discussion: https://postgr/es/m/0473bf5c-57b1-f1f7-3d58-455c2230bc5f@lab.ntt.co.jp
      6666ee49
    • Robert Haas's avatar
      Generate a separate upper relation for each stage of setop planning. · c596fadb
      Robert Haas authored
      Commit 3fc6e2d7 made setop planning
      stages return paths rather than plans, but all such paths were loosely
      associated with a single RelOptInfo, and only the final path was added
      to the RelOptInfo.  Even at the time, it was foreseen that this should
      be changed, because there is otherwise no good way for a single stage
      of setop planning to return multiple paths.  With this patch, each
      stage of set operation planning now creates a separate RelOptInfo;
      these are distinguished by using appropriate relid sets.  Note that
      this patch does nothing whatsoever about actually returning multiple
      paths for the same set operation; it just makes it possible for a
      future patch to do so.
      
      Along the way, adjust things so that create_upper_paths_hook is called
      for each of these new RelOptInfos rather than just once, since that
      might be useful to extensions using that hook.  It might be a good
      to provide an FDW API here as well, but I didn't try to do that for
      now.
      
      Patch by me, reviewed and tested by Ashutosh Bapat and Rajkumar
      Raghuwanshi.
      
      Discussion: http://postgr.es/m/CA+TgmoaLRAOqHmMZx=ESM3VDEPceg+-XXZsRXQ8GtFJO_zbMSw@mail.gmail.com
      c596fadb
    • Robert Haas's avatar
      Rewrite recurse_union_children to iterate, rather than recurse. · 49525c46
      Robert Haas authored
      Also, rename it to plan_union_chidren, so the old name wasn't
      very descriptive.  This results in a small net reduction in code,
      seems at least to me to be easier to understand, and saves
      space on the process stack.
      
      Patch by me, reviewed and tested by Ashutosh Bapat and Rajkumar
      Raghuwanshi.
      
      Discussion: http://postgr.es/m/CA+TgmoaLRAOqHmMZx=ESM3VDEPceg+-XXZsRXQ8GtFJO_zbMSw@mail.gmail.com
      49525c46
    • Magnus Hagander's avatar
      Fix typo in comment · 71cce90e
      Magnus Hagander authored
      Author: Daniel Gustafsson <daniel@yesql.se>
      71cce90e
  3. 18 Mar, 2018 2 commits
    • Tom Lane's avatar
      Doc: note that statement-level view triggers require an INSTEAD OF trigger. · a4678320
      Tom Lane authored
      If a view lacks an INSTEAD OF trigger, DML on it can only work by rewriting
      the command into a command on the underlying base table(s).  Then we will
      fire triggers attached to those table(s), not those for the view.  This
      seems appropriate from a consistency standpoint, but nowhere was the
      behavior explicitly documented, so let's do that.
      
      There was some discussion of throwing an error or warning if a statement
      trigger is created on a view without creating a row INSTEAD OF trigger.
      But a simple implementation of that would result in dump/restore ordering
      hazards.  Given that it's been like this all along, and we hadn't heard
      a complaint till now, a documentation improvement seems sufficient.
      
      Per bug #15106 from Pu Qun.  Back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/152083391168.1215.16892140713507052796@wrigleys.postgresql.org
      a4678320
    • Magnus Hagander's avatar
      Fix pg_recvlogical for pre-10 versions · 8d2814f2
      Magnus Hagander authored
      In e170b8c8, protection against modified search_path was added. However,
      PostgreSQL versions prior to 10 does not accept SQL commands over a
      replication connection, so the protection would generate a syntax error.
      
      Since we cannot run SQL commands on it, we are also not vulnerable to
      the issue that e170b8c8 fixes, so we can just skip this command for
      older versions.
      
      Author: Michael Paquier <michael@paquier.xyz>
      8d2814f2
  4. 17 Mar, 2018 7 commits
    • Tom Lane's avatar
      Fix overflow handling in plpgsql's integer FOR loops. · 2dbee9f1
      Tom Lane authored
      The test to exit the loop if the integer control value would overflow
      an int32 turns out not to work on some ICC versions, as it's dependent
      on the assumption that the compiler will execute the code as written
      rather than "optimize" it.  ICC lacks any equivalent of gcc's -fwrapv
      switch, so it was optimizing on the assumption of no integer overflow,
      and that breaks this.  Rewrite into a form that in fact does not
      do any overflowing computations.
      
      Per Tomas Vondra and buildfarm member fulmar.  It's been like this
      for a long time, although it was not till we added a regression test
      case covering the behavior (in commit dd2243f2) that the problem
      became apparent.  Back-patch to all supported versions.
      
      Discussion: https://postgr.es/m/50562fdc-0876-9843-c883-15b8566c7511@2ndquadrant.com
      2dbee9f1
    • Tom Lane's avatar
      Fix WHERE CURRENT OF when the referenced cursor uses an index-only scan. · 8f5ac440
      Tom Lane authored
      "UPDATE/DELETE WHERE CURRENT OF cursor_name" failed, with an error message
      like "cannot extract system attribute from virtual tuple", if the cursor
      was using a index-only scan for the target table.  Fix it by digging the
      current TID out of the indexscan state.
      
      It seems likely that the same failure could occur for CustomScan plans
      and perhaps some FDW plan types, so that leaving this to be treated as an
      internal error with an obscure message isn't as good an idea as it first
      seemed.  Hence, add a bit of heaptuple.c infrastructure to let us deliver
      a more on-topic message.  I chose to make the message match what you get
      for the case where execCurrentOf can't identify the target scan node at
      all, "cursor "foo" is not a simply updatable scan of table "bar"".
      Perhaps it should be different, but we can always adjust that later.
      
      In the future, it might be nice to provide hooks that would let custom
      scan providers and/or FDWs deal with this in other ways; but that's
      not a suitable topic for a back-patchable bug fix.
      
      It's been like this all along, so back-patch to all supported branches.
      
      Yugo Nagata and Tom Lane
      
      Discussion: https://postgr.es/m/20180201013349.937dfc5f.nagata@sraoss.co.jp
      8f5ac440
    • Michael Meskes's avatar
      Fix closing of incorrectly named cursor. · e400840b
      Michael Meskes authored
      Patch by "Shinoda, Noriyoshi" <noriyoshi.shinoda@hpe.com>
      e400840b
    • Peter Eisentraut's avatar
      Set libpq sslcompression to off by default · e3bdb2d9
      Peter Eisentraut authored
      Since SSL compression is no longer recommended, turn the default in
      libpq from on to off.
      
      OpenSSL 1.1.0 and many distribution packages already turn compression
      off by default, so such a server won't accept compression anyway.  So
      this will mainly affect users of older OpenSSL installations.
      
      Also update the documentation to make clear that this setting is no
      longer recommended.
      
      Discussion: https://www.postgresql.org/message-id/flat/595cf3b1-4ffe-7f05-6f72-f72b7afa7993%402ndquadrant.com
      e3bdb2d9
    • Peter Eisentraut's avatar
      Add ssl_passphrase_command setting · 8a3d9425
      Peter Eisentraut authored
      This allows specifying an external command for prompting for or
      otherwise obtaining passphrases for SSL key files.  This is useful
      because in many cases there is no TTY easily available during service
      startup.
      
      Also add a setting ssl_passphrase_command_supports_reload, which allows
      supporting SSL configuration reload even if SSL files need passphrases.
      Reviewed-by: default avatarDaniel Gustafsson <daniel@yesql.se>
      8a3d9425
    • Andres Freund's avatar
      Add 'unit' parameter to ExplainProperty{Integer,Float}. · 7a50bb69
      Andres Freund authored
      This allows to deduplicate some existing code, but mainly avoids some
      duplication in upcoming commits.
      
      In passing, fix variable names indicating wrong unit (seconds instead
      of ms).
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20180314002740.cah3mdsonz5mxney@alap3.anarazel.de
      7a50bb69
    • Andres Freund's avatar
      Make ExplainPropertyInteger accept 64bit input, remove *Long variant. · f3e4b95e
      Andres Freund authored
      'long' is not useful type across platforms, as it's 32bit on 32 bit
      platforms, and even on some 64bit platforms (e.g. windows) it's still
      only 32bits wide.
      
      As ExplainPropertyInteger should never be performance critical, change
      it to accept a 64bit argument and remove ExplainPropertyLong.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20180314164832.n56wt7zcbpzi6zxe@alap3.anarazel.de
      f3e4b95e
  5. 16 Mar, 2018 9 commits
  6. 15 Mar, 2018 9 commits
    • Tom Lane's avatar
      Clean up duplicate table and function names in regression tests. · 2cf8c7aa
      Tom Lane authored
      Many of the objects we create during the regression tests are put in the
      public schema, so that using the same names in different regression tests
      creates a hazard of test failures if any two such scripts run concurrently.
      This patch cleans up a bunch of latent hazards of that sort, as well as two
      live hazards.
      
      The current situation in this regard is far worse than it was a year or two
      back, because practically all of the partitioning-related test cases have
      reused table names with enthusiasm.  I despaired of cleaning up that mess
      within the five most-affected tests (create_table, alter_table, insert,
      update, inherit); fortunately those don't run concurrently.
      
      Other than partitioning problems, most of the issues boil down to using
      names like "foo", "bar", "tmp", etc, without thought for the fact that
      other test scripts might use similar names concurrently.  I've made an
      effort to make all such names more specific.
      
      One of the live hazards was that commit 7421f4b8 caused with.sql to
      create a table named "test", conflicting with a similarly-named table
      in alter_table.sql; this was exposed in the buildfarm recently.
      The other one was that join.sql and transactions.sql both create tables
      named "foo" and "bar"; but join.sql's uses of those names date back
      only to December or so.
      
      Since commit 7421f4b8 was back-patched to v10, back-patch a minimal
      fix for that problem.  The rest of this is just future-proofing.
      
      Discussion: https://postgr.es/m/4627.1521070268@sss.pgh.pa.us
      2cf8c7aa
    • Robert Haas's avatar
      Split create_grouping_paths into degenerate and non-degenerate cases. · 1466bcfa
      Robert Haas authored
      There's no functional change here, or at least I hope there isn't,
      just code rearrangement.  The rearrangement is motivated by
      partition-wise aggregate, which doesn't need to consider the
      degenerate case but wants to reuse the logic for the ordinary case.
      
      Based loosely on a patch from Ashutosh Bapat and Jeevan Chalke, but I
      whacked it around pretty heavily. The larger patch series of which
      this patch is a part was also reviewed and tested by Antonin Houska,
      Rajkumar Raghuwanshi, David Rowley, Dilip Kumar, Konstantin Knizhnik,
      Pascal Legrand, Rafia Sabih, and me.
      
      Discussion: http://postgr.es/m/CAFjFpRewpqCmVkwvq6qrRjmbMDpN0CZvRRzjd8UvncczA3Oz1Q@mail.gmail.com
      1466bcfa
    • Alvaro Herrera's avatar
      test_ddl_deparse: rename matview · a446a1c7
      Alvaro Herrera authored
      Should have done this in e69f5e0e ...
      Per note from Tom Lane.
      a446a1c7
    • Tom Lane's avatar
      Clean up duplicate role and schema names in regression tests. · fb7db40a
      Tom Lane authored
      Since these names are global, using the same ones in different regression
      tests creates a hazard of test failures if any two such scripts run
      concurrently.  Let's establish a policy of not doing that.  In the cases
      where a conflict existed, I chose to rename both sides: in principle one
      script or the other could've been left in possession of the common name,
      but that seems to just invite more trouble of the same sort.
      
      There are a number of places where scripts are using names that seem
      unduly generic, but in the absence of actual conflicts I left them alone.
      
      In addition, fix insert.sql's use of "someone_else" as a role name.
      That's a flat out violation of longstanding project policy, so back-patch
      that change to v10 where the usage appeared.  The rest of this is just
      future-proofing, as no two of these scripts are actually run concurrently
      in the existing parallel_schedule.
      
      Conflicts of schema-qualified names also exist, but will be dealt with
      separately.
      
      Discussion: https://postgr.es/m/4627.1521070268@sss.pgh.pa.us
      fb7db40a
    • Peter Eisentraut's avatar
      Fix more format truncation issues · 3a4b8919
      Peter Eisentraut authored
      Fix the warnings created by the compiler warning options
      -Wformat-overflow=2 -Wformat-truncation=2, supported since GCC 7.  This
      is a more aggressive variant of the fixes in
      6275f5d2, which GCC 7 warned about by
      default.
      
      The issues are all harmless, but some dubious coding patterns are
      cleaned up.
      
      One issue that is of external interest is that BGW_MAXLEN is increased
      from 64 to 96.  Apparently, the old value would cause the bgw_name of
      logical replication workers to be truncated in some circumstances.
      
      But this doesn't actually add those warning options.  It appears that
      the warnings depend a bit on compilation and optimization options, so it
      would be annoying to have to keep up with that.  This is more of a
      once-in-a-while cleanup.
      Reviewed-by: default avatarMichael Paquier <michael@paquier.xyz>
      3a4b8919
    • Robert Haas's avatar
      Pass additional arguments to a couple of grouping-related functions. · 648a6c7b
      Robert Haas authored
      get_number_of_groups() and make_partial_grouping_target() currently
      fish information directly out of the PlannerInfo; in the former case,
      the target list, and in the latter case, the HAVING qual.  This works
      fine if there's only one grouping relation, but if the pending patch
      for partition-wise aggregate gets committed, we'll have multiple
      grouping relations and must therefore use appropriately translated
      versions of these values for each one.  To make that simpler, pass the
      values to be used as arguments.
      
      Jeevan Chalke.  The larger patch series of which this patch is a part
      was also reviewed and tested by Antonin Houska, Rajkumar Raghuwanshi,
      David Rowley, Dilip Kumar, Konstantin Knizhnik, Pascal Legrand, Rafia
      Sabih, and me.
      
      Discussion: http://postgr.es/m/CAM2+6=UqFnFUypOvLdm5TgC+2M=-E0Q7_LOh0VDFFzmk2BBPzQ@mail.gmail.com
      Discussion: http://postgr.es/m/CAM2+6=W+L=C4yBqMrgrfTfNtbtmr4T53-hZhwbA2kvbZ9VMrrw@mail.gmail.com
      648a6c7b
    • Alvaro Herrera's avatar
      restrict -> pg_restrict · 8d1b805f
      Alvaro Herrera authored
      So that it works on MSVC, too.
      
      Author: Michaël Paquier
      Discussion: https://postgr.es/m/29889.1520968202@sss.pgh.pa.us
      8d1b805f
    • Alvaro Herrera's avatar
      test_ddl_deparse: Don't use pg_class as source for a matview · e69f5e0e
      Alvaro Herrera authored
      Doing so causes a pg_upgrade of a database containing these objects to
      fail whenever pg_class changes.  And it's pointless anyway: we have more
      interesting tables anyhow.
      
      Discussion: https://postgr.es/m/CAD5tBc+s8pW9WvH2+_z=B4x95FD4QuzZKcaMpff_9H4rS0VU1A@mail.gmail.com
      e69f5e0e
    • Alvaro Herrera's avatar
      logical replication: fix OID type mapping mechanism · 24c0a6c6
      Alvaro Herrera authored
      The logical replication type map seems to have been misused by its only
      caller -- it would try to use the remote OID as input for local type
      routines, which unsurprisingly could result in bogus "cache lookup
      failed for type XYZ" errors, or random other type names being picked up
      if they happened to use the right OID.  Fix that, changing
      Oid logicalrep_typmap_getid(Oid remoteid) to
      char *logicalrep_typmap_gettypname(Oid remoteid)
      which is more useful.  If the remote type is not part of the typmap,
      this simply prints "unrecognized type" instead of choking trying to
      figure out -- a pointless exercise (because the only input for that
      comes from replication messages, which are not under the local node's
      control) and dangerous to boot, when called from within an error context
      callback.
      
      Once that is done, it comes to light that the local OID in the typmap
      entry was not being used for anything; the type/schema names are what we
      need, so remove local type OID from that struct.
      
      Once you do that, it becomes pointless to attach a callback to regular
      syscache invalidation.  So remove that also.
      
      Reported-by: Dang Minh Huong
      Author: Masahiko Sawada
      Reviewed-by: Álvaro Herrera, Petr Jelínek, Dang Minh Huong, Atsushi Torikoshi
      Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A6BE964@BPXM05GP.gisp.nec.co.jp
      Discussion: https://postgr.es/m/75DB81BEEA95B445AE6D576A0A5C9E936A6C4B0A@BPXM05GP.gisp.nec.co.jp
      24c0a6c6