# \[IGN-15067\]system.util.getSessionInfo() now returns a BasicDataSet breaking toDataSet() function calls

**URL:** <https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679>\
**Category:** Ignition\
**Tags:** ignition83\
**Created:** [December 8, 2025, 11:49am UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679 "2025-12-08T11:49:07Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![wingram](https://avatars.discourse-cdn.com/v4/letter/w/839c29/32.png) [@wingram](https://forum.inductiveautomation.com/u/wingram)\
**Post date:** [December 8, 2025, 11:49am UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/1 "2025-12-08T11:49:07Z")

</div>

```python
sessions = system.util.getSessionInfo()
dsData = system.db.toDataSet(sessions)

```

- 8.1: [system.util.getSessionInfo | Ignition User Manual](https://www.docs.inductiveautomation.com/docs/8.1/appendix/scripting-functions/system-util/system-util-getSessionInfo "https://www.docs.inductiveautomation.com/docs/8.1/appendix/scripting-functions/system-util/system-util-getSessionInfo")
- 8.3: [system.util.getSessionInfo | Ignition User Manual](https://www.docs.inductiveautomation.com/docs/8.3/appendix/scripting-functions/system-util/system-util-getSessionInfo "https://www.docs.inductiveautomation.com/docs/8.3/appendix/scripting-functions/system-util/system-util-getSessionInfo")

Both the 8.1 and 8.3 manuals intend that this function returns a PyDataSet, however, in 8.3 this function returns a BasicDataSet.

In addition, it appears that you cannot convert a BasicDataSet into a BasicDataSet which throws an error:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/6/a6619c400a35807ddb0f9d6557132c3e89a2e818.png)

However, you can convert a PyDataSet into a PyDataSet so I’m not sure if this behavior is intended:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/8/c/8c42fd14d3fda0283c9ec6bcc4132a824f3011c0.png)

As an aside, I’m aware that system.db.toDataSet() is not a function in the User Manual and it is actually system.dataset.toDataSet() but it appears to resolve anyways…not sure about that one.

Essentially just wanted to see if this behavior is intended:

- Functions that used to return PyDataSets now return BasicDataSets
- You cannot convert a BasicDataset into a BasicDataSet
- You can convert a PyDataSet into a PyDataSet

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 8, 2025, 1:24pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/2 "2025-12-08T13:24:57Z")

</div>

This does look like an unintended side-effect of the consolidation of the `PyDataset` type. In v8.3, **all** Dataset implementations are naturally **also** `PyDataset` instances. No conversions in either direction are needed in v8.3.

For this case, just do `dsData = sessions`.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [December 8, 2025, 1:34pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/3 "2025-12-08T13:34:50Z")

</div>

> [@pturmel](#):
>
> **all** Dataset implementations are naturally **also** `PyDataset` instances.

This isn't really what's going on.

Ignition 8.3 introduces a _new_ `PyDataset` wrapper, (as opposed to the old `DatasetUtilities.PyDataSet`), and does some trickery to ensure all scripting that returns a `Dataset` automatically wraps it with this wrapper...

So in the end conversion should be unnecessary, the old `DatasetUtilities.PyDataSet` is deprecated, the `toPyDataSet` function is deprecated, and conversion should generally be automatic... but it's not accurate to say all `Dataset` are `PyDataset` - that'll get you in trouble if you end up somewhere that types matter.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 8, 2025, 1:38pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/4 "2025-12-08T13:38:32Z")

</div>

Ok. Is the "trickery" the use of `Py.getAdapter()` to install a global, automatic wrapper? If so, I'm happy, as that means **any** `Dataset` will get the wrapper, even if delivered by non-IA code.

If that **isn't** the trickery, I'll open a ticket to get it fixed.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [December 8, 2025, 1:38pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/5 "2025-12-08T13:38:47Z")

</div>

Yeah that's it.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 8, 2025, 1:40pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/6 "2025-12-08T13:40:17Z")

</div>

💯

I'm hoping Paul will get around to doing this for the Vision PyComponentWrapper, too, so I can take it out of my Integration Toolkit.

{ Wow. It's been over [seven years](https://forum.inductiveautomation.com/t/transaction-groups-triggered-expression-item-updating-when-trigger-is-false/17196/19). }

---

<div class="post-metadata">

**Author:** ![wingram](https://avatars.discourse-cdn.com/v4/letter/w/839c29/32.png) [@wingram](https://forum.inductiveautomation.com/u/wingram)\
**Post date:** [December 8, 2025, 2:08pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/7 "2025-12-08T14:08:53Z")

</div>

I gotcha, it’s more about hunting down all the instances where we convert what used to be a PyDataSet to a BasicDataSet. Can I expect that any other system functions that used to return PyDataSets have this behavior as well?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [December 8, 2025, 2:11pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/8 "2025-12-08T14:11:52Z")

</div>

Nothing should have stopped working or required code changes when you upgraded.

If so, @paul-griffith probably wants to know 🙃

---

<div class="post-metadata">

**Author:** ![wingram](https://avatars.discourse-cdn.com/v4/letter/w/839c29/32.png) [@wingram](https://forum.inductiveautomation.com/u/wingram)\
**Post date:** [December 8, 2025, 2:14pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/9 "2025-12-08T14:14:51Z")

</div>

I gotcha, it looks like since system.util.getSessionInfo() now returns a BasicDataSet using the toDataSet conversion has broken a bunch of scripts we use for gateway maintenance.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 8, 2025, 5:04pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/10 "2025-12-08T17:04:46Z")

</div>

This is a particularly unfortunate edge case.

> [@wingram](#):
>
> system.db.toDataSet()

If you had been using `system.dataset.toDataSet` this whole time, you would have never noticed. As in, your first test of "wrapping" a DS in a DS _will_ work if you use `system.dataset.toDataSet`.

`system.db.toDataSet` has been deprecated and hidden since **2011** , and is coded (on the Java "backend" side of things) in such a way that it requires you pass in a 'true' `PyDataSet`. `DatasetUtilities`, which is ultimately what `system.dataset` functions call into, would happily accept either type and (not) do the wrapping.

> [@wingram](#):
>
> convert a PyDataSet into a PyDataSet

This is deliberately "supported", but is not actually doing anything; we're detecting that you're trying to 'wrap' and just handing back the original dataset.

The **correct** thing to do in an 8.3+ script is to just ignore the concept of pydatasets completely. Forget they ever existed, remove all operations that wrapped/unwrapped them, and have a happier life.

Understanding that that isn't the most practical on existing large codebases, I'd say that the _easiest_ advice would be to machine edit/find & replace all instances of `system.db.toDataSet` and replace them with `system.dataset.toDataSet`. I'll eventually get this issue fixed first party now that we're aware of it, but prioritization/timing wise the absolute earliest public release you would **potentially** see this in would be mid-February. I doubt you can wait that long.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 8, 2025, 5:44pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/11 "2025-12-08T17:44:21Z")

</div>

> [@Kevin.Herron](#):
>
> but it's not accurate to say all `Dataset` are `PyDataset` - that'll get you in trouble if you end up somewhere that types matter.

For a little bit of further detail on the shenanigans here:  
`type(someWrappedDataset)` will faithfully report the **underlying** dataset type instance, even through the automatic wrapping.

Also, the new wrapper class is `com.inductiveautomation.ignition.common.script.builtin.PyDataset`, **distinct** from `com.inductiveautomation.ignition.common.script.builtin.DatasetUtilities.PyDataSet`, and there's no subtype relationship between them. Note that different in capitalization.

So far this is the only significant edge case I'm aware of that slipped through all manual and automated testing of 8.1 vs 8.3, and it's with a 14-year deprecated scripting function, so I'll take it.

---

<div class="post-metadata">

**Author:** ![wingram](https://avatars.discourse-cdn.com/v4/letter/w/839c29/32.png) [@wingram](https://forum.inductiveautomation.com/u/wingram)\
**Post date:** [December 8, 2025, 6:42pm UTC](https://forum.inductiveautomation.com/t/ign-15067-system-util-getsessioninfo-now-returns-a-basicdataset-breaking-todataset-function-calls/112679/12 "2025-12-08T18:42:16Z")

</div>

Thank you paul, I appreciate the quick response! And mid-February is out of the cards so it looks like it’s time for a good ole’ Ctrl + F
